Inicie un comando de shell con un script de python, espere la finalización y regrese al script
-
11-07-2019 - |
Pregunta
Tengo un script de Python que tiene que iniciar 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 del " myscript " el comando ha finalizado, la ejecución se detiene y no vuelve al script de Python.
¿Cómo puedo hacer? ¿Tengo que fork ()
antes de llamar a os.execlp ()
?
Solución
subproceso: el módulo
subproceso
le permite generar nuevos procesos, conectarse a su entrada / salida / error tuberías 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
Otros consejos
Puede usar subprocess.Popen
. Hay algunas formas 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 realmente hace el programa externo:
cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
El módulo de subproceso ha avanzado desde 2008. En particular check_call
y check_output
facilitan aún más las cosas simples de subprocesos. La familia de funciones check_ *
es agradable, ya que generan 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 la salida (técnicamente myscript
y su script de 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 todavía se mostrará a menos que agregue la opciónstderr = subprocess.PIPE
. -
check_output (['myscript', f])
check_output
devuelve el stdout como una cadena para que no se muestre. stderr todavía se muestra a menos que agregue la opciónstderr = subprocess.STDOUT
.
Las funciones os.exec * ()
reemplazan el programa actual con el nuevo. Cuando este programa termina, también lo hace su proceso. Probablemente desee os.system ()
.
usar spawn
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
Uso os.system
import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))
¡Esto me funcionó bien!
shell_command = " ls -l "
subprocess.call (shell_command.split ())