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.
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 attendretimeout
secondes pour terminer le processus. Si elle n'est pas complète, elle lancera leTimeoutExpired
exception. Si vous attrapez l'exception, vous êtes les bienvenus pour continuer, ou surwait
nouveau.poll
retourne toujours immédiatement. Il fait effectivement une attente avec un timeout de 0, attrape n'importe quelle exception, et retourneNone
si le processus n'a pas compléter.- par
wait
oupoll
, si le processus est terminé, l'objet popen estreturncode
(sinon, il n' - vous pouvez vérifier que aussi facilement que d'appelerwait
oupoll
), 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.
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.