2016-07-23 11 views
0

Ich habe eine PyQt5-App, die Eingabe für den Unterprozess zu stoppen schreiben müssen.Warum python Subprocess.stdin.write() töten PyQt Gui

Allerdings tötet es auch meine PyQt5 Mainwindow, wenn Eingangstaste verwendet wird, ohne die Subprocess-Taste zuerst zu verwenden.

Wenn ich Subprocess-Taste zuerst, und dann Eingabe-Taste verwenden, mit self.bob.stdin.write("b") App bleibt geöffnet, aber wenn ich die Eingabetaste zuerst drücken ohne Subprocess-Taste self.bob.stdin.write("b") drücken es tötet meine App und Hauptfenster.

Warum also self.bob.stdin.write("b") Kill-App, und wie kann ich aufhören, mein MainWindow zu töten, wenn ich zuerst die Eingabetaste drücke?

Das Dilemma kann in diesem Testcode gesehen werden.

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(308, 156) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.Button_2 = QtWidgets.QPushButton(self.centralwidget) 
     self.Button_2.setGeometry(QtCore.QRect(20, 40, 121, 71)) 
     self.Button_2.setObjectName("subprocessButton_2") 
     self.Button_1 = QtWidgets.QPushButton(self.centralwidget) 
     self.Button_1.setGeometry(QtCore.QRect(170, 40, 121, 71)) 
     self.Button_1.setObjectName("inputbutton") 
     MainWindow.setCentralWidget(self.centralwidget) 


     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     self.Button_2.setText(_translate("MainWindow", "subprocess")) 
     self.Button_1.setText(_translate("MainWindow", "input")) 

     self.Button_2.clicked.connect(self.sub) 
     self.Button_1.clicked.connect(self.input) 

    def sub(self): 

     import subprocess 
     from subprocess import Popen, PIPE 
     from subprocess import Popen, PIPE 
     self.bob = subprocess.Popen('cmd ',stdin=PIPE, shell=True) 

    def input(self): 
     self.bob.stdin.write("q") 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 
+0

Können Sie den Code auf das minimal erforderliche Beispiel reduzieren, um das Problem zu demonstrieren? Dies erleichtert das Auffinden des Problems. –

+0

entfernt einige Zeilen, das Minimum für App-Erstellung, und zwei Drucktasten Funktionen Wenn Sie die linke Taste drücken, und dann die rechte Taste, dann ist es in Ordnung. Aber wenn Sie links zuerst drücken, dann GUI beendet –

Antwort

1

Ohne den gesamten Code zu verstehen, hier ist was ich denke, Ihr Code umgewandelt in ein Skript macht:

import subprocess 
from subprocess import Popen, PIPE 

# sub button handler 
bob = subprocess.Popen('echo',stdin=PIPE, shell=True) 

# input button handler 
bob.stdin.write(b"text") 

ich Sie denken lasse, was hapens, wenn Sie nicht 1 Schritt tun.

+0

ja, das ist meine Skripte eingegrenzt, aber das Problem ist, dass es ein Teil eines PyQt Gui ist, und das ist, was bob.stdin.write (b "Text") kills –

+1

Ich sehe, weil es nicht finden kann Bob in Schritt zwei seit es in Schritt eins.Facepalm thx –

+0

Sie erhalten wahrscheinlich eine 'AttributError', wenn Sie' self.bob' tun. Ich würde sagen, Sie haben hier einige Möglichkeiten: (1) Umbrechen Sie die Funktion in "try ... catch AttributeError", (2) überprüfen Sie am Anfang der Funktion für "self.bob" oder (3) deaktivieren Sie die zweite Schaltfläche bis ' self.bob' ist verfügbar. –