2009-12-06 2 views
1

Pourquoi ne reçois-je jamais le signal readyReadStandardOutput lors de l'exécution de ce qui suit?Aucun signal readyReadStandardOutput de QProcess

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

Répondre

3

deux problèmes:

  1. Vous devez créer une instance QApplication avant de créer tout le reste.
  2. Votre processus enfant met en tampon sa sortie.

Voici le code fixe, seulement deux lignes ont changé:

  1. app = QApplication déplacé avant proc = QProcess
  2. processus enfant a maintenant sys.stdout.flush()

Et maintenant tout fonctionne comme prévu:

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

Oui, cela fonctionne. Merci. Je pensais que j'ajouterais qu'il est probablement préférable de rendre la sortie sans tampon en passant l'indicateur -u au processus python. De cette façon, vous n'avez pas besoin de changer le script cible. –