J'ai un script python qui doit lancer une commande Shell pour chaque fichier d'un répertoire:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Cela fonctionne bien pour le premier fichier, mais une fois la commande "myscript" terminée, l'exécution s'arrête et ne revient pas au script python.
Comment puis-je faire? Dois-je fork()
avant calling os.execlp()
?
sous-processus: Le module
subprocess
vous permet de générer de nouveaux processus, connecter à leur entrée/sortie/erreur tuyaux, et obtenir leurs codes de retour.
http://docs.python.org/library/subprocess.html
Usage:
import subprocess
process = subprocess.Popen(command, Shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
Vous pouvez utiliser subprocess.Popen
. Il y a plusieurs 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 le programme externe fait réellement:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
Le module de sous-processus a fait son chemin depuis 2008. En particulier check_call
et check_output
facilitent encore davantage les tâches de sous-processus simples. La famille de fonctions _check_*
_ permet de créer une exception en cas de problème.
_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 l'avait produite (techniquement myscript
et votre script python partage la même sortie standard). Il y a plusieurs façons d'éviter cela.
check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
myscript
produit plus de 4k de sortie). stderr sera toujours affiché sauf si vous ajoutez l'option _stderr=subprocess.PIPE
_.check_output( [ 'myscript', f ] )
check_output
_ renvoie la sortie standard sous forme de chaîne, de sorte qu'elle ne soit pas affichée. stderr est toujours affiché, sauf si vous ajoutez l'option _stderr=subprocess.STDOUT
_.os.exec*()
functions replace le programme actuel par le nouveau. Lorsque ce programme se termine, votre processus se termine. Vous voulez probablement os.system()
.
utiliser spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
cela a fonctionné pour moi bien!
Shell_command = "ls -l"
subprocess.call(Shell_command.split())
J'utilise os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))