2009-12-06 42 views
1

为什么我运行以下命令时从来没有得到readyReadStandardOutput信号?没有来自QProcess的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() 

回答

3

两个问题在这里:

  1. 您应该创建其他一切之前创建QApplication的实例。
  2. 您的子进程缓冲其输出。

这里是固定的代码,只有两行改为:

  1. app = QApplication移动之前proc = QProcess
  2. 子进程现在有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() 
+1

是的,那是有效的。谢谢。只是想我会添加它可能更好,通过将-u标志传递给python进程来使输出无缓冲。这样你就不必改变目标脚本。 – 2009-12-06 08:46:31