문제

다음을 실행할 때 ReadyStandardOutput 신호를받지 않는 이유는 무엇입니까?

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()
도움이 되었습니까?

해결책

여기에 두 가지 문제가 있습니다.

  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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top