¿Cuál es la diferencia entre el subproceso Popen y la llamada (cómo puedo usarlos)?

Quiero llamar a un progtwig externo de Python. He usado tanto Popen() como call() para hacer eso.

¿Cuál es la diferencia entre los dos?

Mi objective específico es ejecutar el siguiente comando desde Python. No estoy seguro de cómo funcionan las redirecciones.

 ./my_script.sh > output 

Leí la documentación y dice que call() es una función de conveniencia o una función de acceso directo. ¿Perdemos poder usando call() lugar de Popen() ?

Hay dos formas de hacer la redirección. Ambos se aplican a subprocess.Popen o subprocess.call .

  1. Establezca el argumento de la palabra clave shell = True o executable = /path/to/the/shell y especifique el comando tal como lo tiene allí.

  2. Ya que solo está redirigiendo la salida a un archivo, establezca el argumento de palabra clave

     stdout = an_open_writeable_file_object 

    donde el objeto apunta al archivo de output .

subprocess.Popen es más general que subprocess.call .

Popen no bloquea, lo que le permite interactuar con el proceso mientras se está ejecutando, o continuar con otras cosas en su progtwig Python. La llamada a Popen devuelve un objeto Popen .

call no bloquea. Si bien admite todos los mismos argumentos que el constructor de Popen , por lo que aún puede establecer la salida del proceso, las variables de entorno, etc., su script espera a que se complete el progtwig y la call devuelve un código que representa el estado de salida del proceso.

 returncode = call(*args, **kwargs) 

es básicamente lo mismo que llamar

 returncode = Popen(*args, **kwargs).wait() 

call es solo una función de conveniencia. Su implementación en CPython está en subprocess.py :

 def call(*popenargs, timeout=None, **kwargs): """Run command with arguments. Wait for command to complete or timeout, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) """ with Popen(*popenargs, **kwargs) as p: try: return p.wait(timeout=timeout) except: p.kill() p.wait() raise 

Como puedes ver, es una envoltura delgada alrededor de Popen .