没有来自QProcess的readyReadStandardOutput信号

时间:2009-12-06 03:24:44

标签: python qt pyqt 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()

1 个答案:

答案 0 :(得分:4)

这里有两个问题:

  1. 您应该在创建其他所有内容之前创建QApplication实例。
  2. 您的子进程正在缓冲其输出。
  3. 这是固定代码,只改变了两行:

    1. app = QApplicationproc = QProcess
    2. 之前移动
    3. 子进程现在有sys.stdout.flush()
    4. 现在一切都按预期工作:

      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()