web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si un sous-processus est toujours en cours d'exécution?

Je lance un certain nombre de sous-processus avec subprocess.Popen en Python. J'aimerais vérifier si un tel processus est terminé. J'ai trouvé deux façons de vérifier l'état d'un sous-processus, mais les deux semblent forcer le processus à se terminer. L’une utilise process.communicate () et l’impression du code retour, comme expliqué ici . Une autre consiste simplement à appeler process.wait () et à vérifier qu’il renvoie 0.

Existe-t-il un moyen de vérifier si un processus est toujours en cours d'exécution sans attendre la fin de son exécution?

24
ahura

Ouestion: ... un moyen de vérifier si un processus est toujours en cours d'exécution ... 

Vous pouvez le faire par exemple: 

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 Documentation objets-popen

Testé avec Python: 3.4.2 

31
stovfl

Faire le 

myProcessIsRunning = poll() is None 

Comme suggéré par la réponse principale, est la méthode recommandée et la méthode la plus simple pour vérifier si un processus est en cours d'exécution. (et ça marche aussi en jython)

Si vous n'avez pas l'instance de processus en main pour la vérifier ..__, utilisez ensuite les processus du système d'exploitation TaskList/Ps.

Sur les fenêtres, ma commande va ressembler à ceci:

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

Cela fait essentiellement la même chose que la ligne de commande suivante:

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

Et sur linux, je fais exactement la même chose en utilisant le:

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

La commande ps renverra déjà le code d'erreur 0/1 selon que le processus est trouvé ou non. Sous Windows, vous avez besoin de la commande find string.

Il s'agit de la même approche que celle qui est décrite sur le thread de dépassement de pile de la pile suivante:

Vérifier si un processus est en cours d'exécution à l'aide de son PID en Java

NOTE: Si vous utilisez cette approche, rappelez-vous d’envelopper votre appel de commande dans
essayer: foundRunningProcess = subprocess.check_output (argumentsArray, ** kwargs) retourne True sauf exception comme err: retourne Faux

Remarque, faites attention si vous développez avec VS Code et utilisez Python et Jython purs . Sur mon environnement, je pensais que la méthode poll () ne fonctionnait pas, car un processus que j’imaginais mettre fin à effectivement en cours d'exécution . Ce processus avait lancé Wildfly. Et après avoir demandé à Wildfly de s’arrêter, le Shell attendait toujours que l’utilisateur «appuie sur une touche pour continuer…».

Afin de terminer ce processus, le code suivant fonctionnait en python pur:

process.stdin.write(os.linesep)

Sur jython, j'ai dû corriger ce code pour qu'il se présente comme suit:

print >>process.stdin, os.linesep

Et avec cette différence, le processus s'est bel et bien terminé… __. Et jython.poll () a commencé à me dire que le processus était bel et bien terminé.

2
99Sono

Vous pouvez utiliser subprocess.check_output pour examiner votre sortie.

Essayez ce code:

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

J'espère que cela a aidé!

0
nocturnal_beast