Aucun signal de readyReadStandardOutput de QProcess
Question
Pourquoi je ne reçois le signal readyReadStandardOutput quand je lance ce qui suit?
import os, sys, textwrap
from PyQt4 import QtGui, QtCore
out_file = open("sleep_loop.py", 'w')
out_file.write(textwrap.dedent("""
import time
while True:
print "sleeping..."
time.sleep(1)"""))
out_file.close()
def started():
print "started"
def on_error(error):
errors = ["Failed to start", "Crashed", "Timedout", "Read error",
"Write Error", "Unknown Error"]
print "error: ", errors[error]
def on_state_change(new_state):
states = ["Not running", "Starting", "Running"]
print "new state: ", states[new_state]
def on_out():
print "got out"
proc = QtCore.QProcess()
sig = QtCore.SIGNAL
proc.connect(proc, sig("started()"), started)
proc.connect(proc, sig("error(ProcessError)"), on_error)
proc.connect(proc, sig("readyReadStandardOutput()"), on_out)
proc.connect(proc, sig("stateChanged(ProcessState)"),
on_state_change)
proc.start("python sleep_loop.py")
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
widget.show()
app.exec_()
proc.close()
La solution
Deux problèmes ici:
- Vous devriez créer une instance QApplication avant de créer tout le reste.
- Votre processus de mise en mémoire tampon enfant est sa sortie.
Voici le code fixe, seulement deux lignes modifiées:
-
app = QApplication
déplacé avantproc = QProcess
- processus enfant a maintenant
sys.stdout.flush()
Et maintenant tout fonctionne comme prévu:
import os, sys, textwrap
from PyQt4 import QtGui, QtCore
out_file = open("sleep_loop.py", 'w')
out_file.write(textwrap.dedent("""
import time, sys
while True:
print "sleeping..."
sys.stdout.flush()
time.sleep(1)"""))
out_file.close()
def started():
print "started"
def on_error(error):
errors = ["Failed to start", "Crashed", "Timedout", "Read error",
"Write Error", "Unknown Error"]
print "error: ", errors[error]
def on_state_change(new_state):
states = ["Not running", "Starting", "Running"]
print "new state: ", states[new_state]
def on_out():
print "got out"
app = QtGui.QApplication(sys.argv)
proc = QtCore.QProcess()
sig = QtCore.SIGNAL
proc.connect(proc, sig("started()"), started)
proc.connect(proc, sig("error(ProcessError)"), on_error)
proc.connect(proc, sig("readyReadStandardOutput()"), on_out)
proc.connect(proc, sig("stateChanged(ProcessState)"),
on_state_change)
proc.start("python sleep_loop.py")
widget = QtGui.QWidget()
widget.show()
app.exec_()
proc.close()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow