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

45
demandé sur Harley Holcombe 2008-11-28 13:42:03

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
79
répondu user39307 2015-10-28 09:19:05

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()
51
répondu Harley Holcombe 2012-11-30 04:51:28

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 si myscript produit plus de 4k de sortie). stderr sera toujours affiché à moins que vous n'ajoutiez l'option stderr=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'option stderr=subprocess.STDOUT.
12
répondu deft_code 2011-03-04 14:38:39

os.exec*() fonctions remplacer l'actuel programme avec le nouveau. Lorsque ce programme se termine ainsi fait votre processus. Vous voulez probablement os.system().

7
répondu 2008-11-28 10:45:23

utiliser spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
3
répondu M. Utku ALTINKAYA 2008-11-28 10:58:10

j'utilise os.système

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
0
répondu Nikolay Frick 2018-03-08 20:56:10