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 simyscript
produce más de 4k de salida). Stderr seguirá mostrándose a menos que agregue la opciónstderr=subprocess.PIPE
. -
check_output( [ ''myscript'', f ] )
check_output
devuelve 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
subprocess
permite 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