Lancer une commande shell dans un script python, attendre pour la résiliation et à la retour vers le script
J'ai un script python pour lancer une commande shell pour chaque fichier dans un répertoire:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Cela fonctionne très bien pour le premier fichier, mais après le "myscript" commande terminée, l'exécution s'arrête et ne reviennent pas à l'script python.
Comment puis-je faire? Dois-je fork()
avant calling os.execlp()
?
Vous devez vous connecter pour publier un commentaire.
http://docs.python.org/library/subprocess.html
Utilisation:
shell=True
est inutile.Vous pouvez utiliser
sous-processus.Popen
. Il ya quelques façons de le faire:Ou, si vous ne vous souciez pas de ce que l'externe du programme:
for line in p.stdout:
pourrait retarder la sortie d'une ligne en raison de la lecture anticipée. Vous pouvez utiliserfor line in iter(p.stdout.readline, b''): print line,
(note: la virgule à la fin). Supprimer stdout=TUYAU dans le deuxième exemple, il peut se bloquer le script. Ou simplement l'utilisersubprocess.call()
si vous n'avez pas besoin d'une exception pour les non-zéro code de retourLe sous-processus module a parcouru un long chemin depuis 2008. En particulier
check_call
etcheck_output
faire simple sous-processus des trucs encore plus facile. Lecheck_*
famille de fonctions sont sympa il qu'ils soulèvent une exception si quelque chose va mal.Toute sortie générée par
myscript
s'affiche comme votre processus a produit le résultat (techniquementmyscript
et votre script python partagent le même stdout). Il ya un couple de façons de l'éviter.check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
La sortie standard (stdout) sera supprimé (attention si
myscript
produit plus que 4k de sortie). stderr sera toujours montré, sauf si vous ajoutez l'optionstderr=subprocess.PIPE
.check_output( [ 'myscript', f ] )
check_output
retourne le stdout comme une chaîne de sorte qu'il n'est pas démontré. stderr est toujours affiché, sauf si vous ajoutez l'optionstderr=subprocess.STDOUT
.subprocess.check_*
fonctions fait appel externe binaires plus facile que manuellement à l'aide desubprocess.Popen
. En particulier, vous de ne jamais avoir à traiter avecwait()
,communicate()
,return_code
, etc. Vous aussi n'avez pas besoin de vous soucier des problèmes comme le balançant tuyau de décrochage de l'exécutable. Quand il s'agit de l'interaction avec un externe binaire lecheck_*
fonctions ne sont pas extrêmement utile, mais pour la plupart des cas d'utilisation le résultat est plus court et moins sujette aux erreurs, aka plus facile.subprocess.DEVNULL
ouopen(os.devnull, 'r+b')
d'ignorer d'entrée/sortie au lieu de sous-processus.TUYAU pour éviter de dead-lockLa
os.exec*()
fonctions remplacer l'actuel programme avec le nouveau. Lorsque ce programme se termine le fait de votre processus. Vous voulez probablementos.system()
.utilisation frayer
- Je utiliser os.système
cela a fonctionné pour moi bien!
shell_command = "ls -l"
subprocess.call(shell_command.split())