2009-12-06 39 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