2016-07-23 2 views
0

서브 프로세스가 멈출 수 있도록 입력을 작성해야하는 PyQt5 앱이 있습니다.왜 파이썬 Subprocess.stdin.write() kill PyQt Gui

그러나 입력 버튼이 하위 프로세스 버튼을 먼저 사용하지 않고 사용되면 Mainwindow도 죽입니다.

먼저 하위 프로세스 버튼을 사용하고 self.bob.stdin.write("b") 응용 프로그램과 함께 입력 버튼을 사용하는 경우 하위 버튼 self.bob.stdin.write("b")을 누르지 않고 입력 버튼을 먼저 누르면 내 응용 프로그램과 Mainwindow가 종료됩니다.

그렇다면 self.bob.stdin.write("b")은 왜 앱을 종료합니까? 먼저 입력 버튼을 누르면 내 MainWindow가 종료되는 것을 어떻게 막을 수 있습니까?

이 테스트 코드에서 딜레마를 볼 수 있습니다. 모든 코드를 이해하지 않고

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

문제를 보여주기 위해 필요한 최소한의 코드로 코드를 줄일 수 있습니까? 이렇게하면 문제를 쉽게 찾을 수 있습니다. –

+0

제거 된 몇 줄, 앱 생성을위한 최소값 및 두 개의 푸시 버튼 기능 왼쪽 버튼을 누른 다음 오른쪽 버튼을 누른 다음 해당 버튼을 누르면됩니다. 그러나 먼저 왼쪽 키를 누르면 GUI가 –

답변

1

, 여기에 내가 스크립트가 수행으로 코드 변환 어떻게 생각이야 :

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") 

나는 당신이 1 단계를하지 않는 경우 hapens 일에 대해 생각 드리겠습니다.

+0

내 스크립트가 좁혀 지지만 종료됩니다. 그러나 문제는 PyQt Gui의 일부이며 bob.stdin.write (b "text")입니다. kill –

+1

내가보기에, 1 단계에서 2 단계에서 밥을 찾을 수 없습니다 .Facepalm thx –

+0

'self.bob'을 할 때 아마 AttributeError가 발생합니다. 나는 당신이 여기에 몇 가지 가능성을 가지고 있다고 말할 것이다 : (1) 함수를 try ... catch AttributeError'로 감싸고, (2) 함수의 시작에서'self.bob'을 검사하거나 (3) 두번째 버튼을' self.bob'을 사용할 수 있습니다. –