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é.waitavec le délai argument va attendretimeoutsecondes pour terminer le processus. Si elle n'est pas complète, elle lancera leTimeoutExpiredexception. Si vous attrapez l'exception, vous êtes les bienvenus pour continuer, ou surwaitnouveau.pollretourne toujours immédiatement. Il fait effectivement une attente avec un timeout de 0, attrape n'importe quelle exception, et retourneNonesi le processus n'a pas compléter.- par
waitoupoll, si le processus est terminé, l'objet popen estreturncode(sinon, il n' - vous pouvez vérifier que aussi facilement que d'appelerwaitoupoll), 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.