webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit zu überprüfen, ob ein Unterprozess noch ausgeführt wird?

Ich starte eine Reihe von Unterprozessen mit subprocess.Popen in Python. Ich möchte überprüfen, ob ein solcher Prozess abgeschlossen ist. Ich habe zwei Möglichkeiten gefunden, den Status eines Unterprozesses zu überprüfen, aber beide scheinen den Abschluss des Prozesses zu erzwingen. Einer benutzt process.communicate () und druckt den Rückkehrcode, wie erklärt hier . Eine andere Methode ruft einfach process.wait () auf und prüft, ob 0 zurückgegeben wird.

Gibt es eine Möglichkeit, um zu überprüfen, ob ein Prozess noch ausgeführt wird, ohne auf den Abschluss zu warten, wenn dies der Fall ist?

24
ahura

Ouestion: ... eine Möglichkeit, zu überprüfen, ob ein Prozess noch läuft ... 

Sie können es zum Beispiel tun: 

p = subprocess.Popen(...
"""
A None value indicates that the process hasn't terminated yet.
"""
poll = p.poll()
if poll == None:
  # p.subprocess is alive

Python »3.6.1 Dokumentation popen-objects

Getestet mit Python: 3.4.2 

31
stovfl

Das tun 

myProcessIsRunning = poll() is None 

Wie von der Hauptantwort vorgeschlagen, ist dies der empfohlene Weg und der einfachste Weg, um zu überprüfen, ob ein Prozess ausgeführt wird. (und es funktioniert auch in Jython)

Wenn Sie die Prozessinstanz nicht zur Hand haben, um sie zu überprüfen, verwenden Sie die TaskList/Ps-Prozesse des Betriebssystems.

Unter Windows sieht mein Befehl folgendermaßen aus:

filterByPid = "PID eq %s" % pid
        pidStr = str(pid)
        commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr",  pidStr ]

Das macht im Wesentlichen dasselbe wie die folgende Befehlszeile:

cmd /c "tasklist /FI "PID eq 55588" | findstr 55588"

Und unter Linux mache ich dasselbe mit:

pidStr = str(pid)
commandArguments = ['ps', '-p', pidStr ]

Der Befehl ps gibt bereits den Fehlercode 0/1 zurück, je nachdem, ob der Prozess gefunden wurde. Unter Windows benötigen Sie den Befehl find string.

Dies ist der gleiche Ansatz, der im nachfolgenden Stack-Überlauf-Thread erläutert wird:

Überprüfen Sie, ob ein Prozess mit seiner PID in Java ausgeführt wird

ANMERKUNG: Wenn Sie diesen Ansatz verwenden, müssen Sie den Befehlsaufruf einschließen
Versuchen: foundRunningProcess = subprozess.check_output (argumentsArray, ** kwargs) return True Ausnahme Ausnahme als Fehler: falsch zurückgeben

Seien Sie vorsichtig, wenn Sie mit VS Code entwickeln und reines Python und Jython verwenden ... In meiner Umgebung hatte ich die Illusion, dass die poll () -Methode nicht funktioniert, weil ein Prozess, von dem ich vermutete, dass er beendet sein muss, war tatsächlich läuft . Dieser Prozess hatte Wildfly gestartet. Und nachdem ich Wildfly gebeten hatte zu stoppen, wartete die Shell immer noch darauf, dass der Benutzer "Drücken Sie eine beliebige Taste, um fortzufahren ...".

Um diesen Vorgang abzuschließen, funktionierte folgender Code in reinem Python:

process.stdin.write(os.linesep)

Bei Jython musste ich diesen Code so korrigieren, dass er wie folgt aussieht:

print >>process.stdin, os.linesep

Und mit diesem Unterschied endete der Prozess in der Tat ... und der jython.poll () begann mir mitzuteilen, dass der Prozess tatsächlich abgeschlossen ist.

2
99Sono

Sie können subprocess.check_output verwenden, um sich Ihre Ausgabe anzusehen.

Versuchen Sie diesen Code:

import subprocess
subprocess.check_output(['your command here'], Shell=True, stderr=subprocess.STDOUT)

Hoffe das hat geholfen!

0
nocturnal_beast