tutorial - Inicie un comando de shell con un script de python, espere la finalización y regrese al script
manual de python 3.6 en español pdf (5)
Tengo un script de python que tiene que ejecutar un comando de shell para cada archivo en un directorio:
import os
files = os.listdir(".")
for f in files:
os.execlp("myscript", "myscript", f)
Esto funciona bien para el primer archivo, pero después de que el comando "myscript" ha finalizado, la ejecución se detiene y no vuelve al script de python.
¿Como lo puedo hacer? ¿Tengo que fork() antes de calling os.execlp() ?
Las os.exec*() reemplazan el programa actual por el nuevo. Cuando este programa termina también lo hace su proceso. Probablemente quiera os.system() .
usar spawn
import os
os.spawnlp(os.P_WAIT, ''cp'', ''cp'', ''index.html'', ''/dev/null'')
El módulo de subproceso ha check_call desde 2008. En particular, check_call y check_output simplifican aún más las check_output subproceso. La familia de funciones check_* es agradable que presenten una excepción si algo sale mal.
import os
import subprocess
files = os.listdir(''.'')
for f in files:
subprocess.check_call( [ ''myscript'', f ] )
Cualquier salida generada por myscript se mostrará como si su proceso produjera el resultado (técnicamente, myscript y su secuencia de comandos python comparten el mismo stdout). Hay un par de formas de evitar esto.
-
check_call( [ ''myscript'', f ], stdout=subprocess.PIPE )
El stdout se suprimirá (tenga cuidado simyscriptproduce más de 4k de salida). Stderr seguirá mostrándose a menos que agregue la opciónstderr=subprocess.PIPE. -
check_output( [ ''myscript'', f ] )
check_outputdevuelve el stdout como una cadena por lo que no se muestra. stderr aún se muestra a menos que agregue la opciónstderr=subprocess.STDOUT.
Puede usar subprocess.Popen . Hay algunas maneras de hacerlo:
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
O, si no le importa lo que el programa externo realmente hace:
cmd = [''/run/myscript'', ''--arg'', ''value'']
subprocess.Popen(cmd).wait()
subproceso: el módulo de
subprocesspermite generar nuevos procesos, conectarse a sus tuberías de entrada / salida / error y obtener sus códigos de retorno.
http://docs.python.org/library/subprocess.html
Uso:
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode