python - ¿Cuál es la diferencia entre el subproceso Popen y la llamada(cómo puedo usarlos)?
python plotly axis (1)
Quiero llamar a un programa externo de Python. He usado tanto Popen()
como call()
para hacer eso.
¿Cuál es la diferencia entre los dos?
Mi objetivo específico es ejecutar el siguiente comando desde Python. No estoy seguro de cómo funcionan las redirecciones.
./my_script.sh > output
Leo la documentación y dice que call()
es una función de conveniencia o una función de acceso directo. ¿ Popen()
energía al usar call()
lugar de Popen()
?
Hay dos formas de hacer la redirección. Ambos se aplican a cualquiera de los subprocess.Popen
o subprocess.call
.
Establezca el argumento de la palabra clave
shell = True
oexecutable = /path/to/the/shell
y especifique el comando tal como lo tiene allí.Como acaba de redirigir el resultado a un archivo, establezca el argumento de la 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 programa de 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 puede establecer el resultado del proceso, las variables de entorno, etc., su secuencia de comandos espera a que el programa se complete 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 puede ver, es una capa delgada alrededor de Popen
.