Inicie un comando de shell con un script de python, espere la finalización y regrese al script

StackOverflow https://stackoverflow.com/questions/325463

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

¿Fue útil?

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 si myscript produce más de 4k de salida). stderr todavía se mostrará a menos que agregue la opción stderr = 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ón stderr = 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 ())

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top