Lancer une commande shell avec dans un script python, attendre la fin et revenir au 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()
?
6 réponses
sous-processus: Le
subprocess
module vous permet de frayer de nouveaux processus, se connecter à leur entrée/sortie/erreur et obtenir leurs codes de retour.
http://docs.python.org/library/subprocess.html
Utilisation:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Vous pouvez utiliser subprocess.Popen
. Il ya quelques façons de le faire:
import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
print line
p.wait()
print p.returncode
Ou, si vous ne vous souciez pas de ce que l'externe du programme:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
le module de sous-processus a progressé depuis 2008. En particulier check_call
et check_output
rendre les choses simples de sous-processus encore plus faciles. check_*
famille de fonctions sont sympa il qu'ils soulèvent une exception si quelque chose va mal.
import os
import subprocess
files = os.listdir('.')
for f in files:
subprocess.check_call( [ 'myscript', f ] )
toute sortie générée par myscript
s'affichera comme si votre processus produisait la sortie (techniquement myscript
et votre script python partage le même stdout). Il ya un couple de façons de éviter cela.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
Le stdout sera supprimé (attention simyscript
produit plus de 4k de sortie). stderr sera toujours affiché à moins que vous n'ajoutiez l'optionstderr=subprocess.PIPE
.check_output( [ 'myscript', f ] )
check_output
renvoie le stdout en chaîne de façon à ce qu'il ne soit pas affiché. stderr est toujours affiché, sauf si vous ajoutez l'optionstderr=subprocess.STDOUT
.
utiliser spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
j'utilise os.système
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))