为什么我在运行以下内容时从未收到readyReadStandardOutput信号?
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()
答案 0 :(得分:4)
这里有两个问题:
这是固定代码,只改变了两行:
app = QApplication
在proc = QProcess
sys.stdout.flush()
现在一切都按预期工作:
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()