2010-06-08 3 views
16

Ich versuche, eine kleine App zu schreiben, die das Modul subprocess verwendet.Unterprozess verwenden wait() und poll()

Mein Programm ruft einen externen Bash-Befehl auf, der einige Zeit zur Verarbeitung benötigt. Während dieser Zeit möchte ich dem Benutzer eine Reihe von Meldungen anzeigen:

Verarbeitung. Bitte warten ...
Der Ausgang ist foo()

Wie kann ich dies mit Popen.wait() oder Popen.poll() tun. Ich habe gelesen, dass ich die Popen.returncode verwenden muss, aber wie ich es bekommen kann, um den Zustand aktiv zu überprüfen, weiß ich nicht.

Antwort

16

Beide wait() (mit timeout angegeben) und poll() Rückkehr None, wenn der Prozess noch nicht abgeschlossen hat, und etwas anderes, wenn der Prozess beendet hat (ich glaube, eine ganze Zahl, den Exit-Code, hoffentlich 0) gewonnen.

bearbeiten:

wait() und poll() unterschiedliche Verhaltensweisen haben:

  • wait (ohne das Argument timeout) blockiert und warten, bis der Vorgang abgeschlossen zu.
  • wait mit dem Timeout-Argument wird timeout Sekunden warten, bis der Prozess abgeschlossen ist. Wenn es nicht abgeschlossen wird, wird die Ausnahme TimeoutExpired ausgelöst. Wenn Sie die Ausnahme abfangen, können Sie dann weitermachen oder wieder zu wait.
  • poll kehrt immer sofort zurück. Es wartet tatsächlich mit einem Timeout von 0, fängt eine Ausnahme ab und gibt None zurück, wenn der Prozess nicht abgeschlossen wurde.
  • Mit entweder wait oder poll, wenn der Prozess abgeschlossen ist, das popen Objekt returncode wird gesetzt (sonst ist es keine - Sie, dass der Check können so einfach wie wait oder poll Aufruf) und der Rückgabewert der Funktion wird auch Geben Sie den Rückgabecode des Prozesses an.

</Bearbeiten>

Also ich denke, man sollte so etwas tun:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

Beachten Sie, dass, wenn die Bash-Skript eine Menge Ausgabe erstellt Ihnen communicate() oder etwas verwenden müssen ähnlich zu verhindern stdout oder stderr zu stopfen.

+0

Ich verwende communicate(). Aber ich verstehe nicht, wie ich den Returncode zurückgeben kann, während der Prozess ausgeführt wird. – user225312

+0

Ich löste es, indem ich das tue: wenn process.poll() ist None: print 'Working' – user225312

+4

Diese Antwort ist falsch. Prüfe die @ onlynones Antwort –

23

@ extraneon die Antwort ist ein wenig rückwärts. Sowohl wait() als auch poll() geben den Beendigungscode des Prozesses zurück, wenn der Prozess beendet wurde.Die poll() Methode wird None zurück, wenn der Prozess noch läuft und die wait() Methode blockiert, bis der Prozess beendet:

Schauen Sie sich auf der folgenden Seite: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Überprüfen Sie, ob Kind-Prozess hat beendet. Setzen Sie das Returncode-Attribut und geben Sie es zurück.

Popen.wait()

Warten Kind-Prozess zu beenden. Setzen Sie das Returncode-Attribut und geben Sie es zurück.