2009-12-06 1 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 = QApplicationproc = 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 플래그를 전달하여 버퍼되지 않은 출력을 만드는 것이 더 좋을 것이라고 생각했습니다. 그렇게하면 대상 스크립트를 변경할 필요가 없습니다. –