web-dev-qa-db-fra.com

Utilisation du sous-processus wait () et poll ()

J'essaie d'écrire une petite application qui utilise le module subprocess.

Mon programme appelle une commande Bash externe qui prend un certain temps à traiter. Pendant ce temps, je voudrais montrer à l'utilisateur une série de messages comme celui-ci:

En traitement. S'il vous plaît, attendez...
La sortie est foo ()

Comment puis-je faire cela en utilisant Popen.wait() ou Popen.poll(). J'ai lu que je dois utiliser le Popen.returncode, mais comment je peux le faire vérifier activement l'état, je ne sais pas.

21
user225312

wait() (avec timeout spécifié) et poll() retourne None si le processus n'a pas encore fini, et quelque chose de différent si le processus a terminé (je pense qu'un entier, le code de sortie, si tout va bien 0).

Modifier :

wait() et poll() ont des comportements différents:

  • wait (sans l'argument timeout) bloquera et attendra la fin du processus.
  • wait avec l'argument timeout attendra timeout secondes pour que le processus se termine. S'il ne se termine pas, il lèvera l'exception TimeoutExpired. Si vous interceptez l'exception, vous pouvez continuer ou continuer à wait.
  • poll renvoie toujours immédiatement. Il effectue effectivement une attente avec un délai d'expiration de 0, intercepte toute exception et renvoie None si le processus n'est pas terminé.
  • Avec wait ou poll, si le processus est terminé, l'objet popen returncode sera défini (sinon c'est None - vous pouvez vérifier pour cela aussi facilement que d'appeler wait ou poll), et la valeur de retour de la fonction sera également le code de retour du processus.

</Edit>

Je pense donc que vous devriez faire quelque chose comme:

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

Sachez que si le script bash crée beaucoup de sortie, vous devez utiliser communicate() ou quelque chose de similaire pour éviter stdout ou stderr pour devenir farci.

29
extraneon

La réponse de @ extraneon est un peu en arrière. wait() et poll() renvoient le code de sortie du processus si le processus est terminé. La méthode poll() renverra None si le processus est toujours en cours et la méthode wait() se bloquera jusqu'à la fin du processus:

Consultez la page suivante: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Vérifiez si le processus enfant s'est terminé. Définissez et renvoyez l'attribut returncode.

Popen.wait()

Attendez la fin du processus enfant. Définissez et renvoyez l'attribut returncode.

28
onlynone