2016-07-23 4 views
0

У меня есть приложение PyQt5, которое должно записывать ввод для подпроцесса для остановки.Почему python Subprocess.stdin.write() убивает PyQt Gui

Однако он также убивает мой PyQt5 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") 

Я дам вам думать о том, что hapens, когда вы не делаете шаг 1.

+0

Да, это мои скрипты сузились, но проблема в том, что это часть PyQt Gui, и вот что такое bob.stdin.write (b "text") Убивает –

+1

Я вижу, когда он не может найти bob на втором шаге с момента его первого шага. Facepalm thx –

+0

Вероятно, вы получите 'AttributeError', когда вы делаете' self.bob'. Я бы сказал, что у вас есть несколько возможностей здесь: (1) обернуть функцию в 'try ... catch AttributeError', (2) проверить в начале функции для' self.bob' или (3) отключить вторую кнопку до тех пор, пока ' self.bob' доступен. –

Смежные вопросы