web-dev-qa-db-fra.com

Lancez une commande Shell avec un script python, attendez la fin et revenez au script

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()?

48
Davide Gualano

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
85
user39307

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()
58
Harley Holcombe

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 )
    La sortie standard sera supprimée (attention si 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_.
12
deft_code

os.exec*() functions replace le programme actuel par le nouveau. Lorsque ce programme se termine, votre processus se termine. Vous voulez probablement os.system().

7
unbeknown

utiliser spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
3
M. Utku ALTINKAYA

cela a fonctionné pour moi bien!

Shell_command = "ls -l" subprocess.call(Shell_command.split())

0
rollthedice32

J'utilise os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
0
Nikolay Frick