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.
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é.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.
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.