Utilisation de subprocess wait () et poll()

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

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

Traitement. Patienter...

La sortie est foo()

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

19
demandé sur ferkulat 2010-06-08 13:03:51

2 réponses

wait() (avec timeout spécifié) et poll() retour None si le processus n'est pas encore fini, et quelque chose de différent si le processus a terminé (je pense à un entier, le code de sortie, j'espère 0).

Edit:

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

  • wait (sans délai d'attente argument) bloquera et attendra que le processus soit terminé.
  • wait avec le délai argument va attendre timeout secondes pour terminer le processus. Si elle n'est pas complète, elle lancera le TimeoutExpired exception. Si vous attrapez l'exception, vous êtes les bienvenus pour continuer, ou sur wait nouveau.
  • poll retourne toujours immédiatement. Il fait effectivement une attente avec un timeout de 0, attrape n'importe quelle exception, et retourne None si le processus n'a pas compléter.
  • par wait ou poll, si le processus est terminé, l'objet popen est returncode (sinon, il n' - vous pouvez vérifier que aussi facilement que d'appeler wait ou poll), et la valeur de retour de la fonction sera aussi le code de retour du processus.

Donc, je pense que vous devriez faire quelque chose comme:

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

soyez conscient que si le script bash crée beaucoup de sortie, vous devez utiliser communicate() ou quelque chose de semblable à éviter stdout ou stderr pour se faire farcir.

21
répondu extraneon 2017-05-31 16:45:34

la réponse de@extraneon est un peu à l'envers. Les deux wait() et poll() retourner le code de sortie du processus si le processus est terminé. poll() méthode sera de retour None si le processus est toujours en cours et le wait() la méthode bloque jusqu'à la sortie du processus:

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

Popen.poll()

Vérifier si le processus s'est terminé. Définir et retourner code_retour attribut.

Popen.wait()

Attendre la fin du processus enfant. Définir et retourner code_retour attribut.

27
répondu onlynone 2015-05-24 04:19:44