usar tutorial script español ejecutar desde consola como comandos archivos python subprocess popen os.execl

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 si myscript produce más de 4k de salida). Stderr seguirá mostrándose a menos que agregue la opción stderr=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ón stderr=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