web-dev-qa-db-fra.com

Python subprocess.Popen () attend la fin

J'écris un petit script pour parcourir en série un répertoire et exécuter une commande sur les sous-répertoires qu'il contient.

Je rencontre cependant un problème avec Popen () qu'il parcourra les répertoires et exécutera la commande souhaitée sans attendre la fin du précédent. c'est à dire.

for dir in dirs:
    #run command on the directory here.

il lance la commande pour chaque dir sans s'en soucier par la suite. Je veux qu'il attende que l'actuel se termine, puis démarre le suivant. L'outil que j'utilise sur les répertoires est Log2timeline de SANS SIFT qui prend un certain temps et produit pas mal de sortie. Je me fiche de la sortie, je veux juste que le programme attende avant de lancer la suivante.

Quelle est la meilleure façon d'y parvenir?

Je vous remercie!

12
DJMcCarthy12

Utilisez Popen.wait :

process = subprocess.Popen(["your_cmd"]...)
process.wait()

Ou check_output , check_call qui attendent tous le code retour en fonction de ce que vous voulez faire et de la version de python.

Si vous utilisez python> = 2.7 et que vous ne vous souciez pas de la sortie, utilisez simplement check_call.

Vous pouvez également utiliser call mais cela ne générera aucune erreur si vous avez un code retour différent de zéro qui peut être souhaitable ou non.

32
Padraic Cunningham
subprocess.check_output( ... )

va bloquer ... et peut être utilisé à la place de Popen

cependant, si vous êtes réglé sur Popen

subprocess.Popen(...).communicate() 

bloquera également jusqu'à ce que le processus revienne

7
Joran Beasley