Quiero llamar a un programa externo desde Python. He usado ambos Popen()
y 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
Leí la documentación y dice que call()
es una función de conveniencia o una función de acceso directo. ¿Perdemos algún poder usando en call()
lugar de Popen()
?
python
subprocess
popen
varunl
fuente
fuente
call()
parece ser muy clara. ¿Puede proporcionar una cotización o un enlace para que sepamos en qué centrarnos en una respuesta?Respuestas:
Hay dos formas de hacer la redirección. Ambos se aplican a cualquiera
subprocess.Popen
osubprocess.call
.Establecer el argumento de palabra clave
shell = True
oexecutable = /path/to/the/shell
y especificar el comando del mismo modo que lo tienes ahí.Como solo está redirigiendo la salida a un archivo, establezca el argumento de la palabra clave
donde el objeto apunta al
output
archivo.subprocess.Popen
es más general quesubprocess.call
.Popen
no se bloquea, lo que le permite interactuar con el proceso mientras se está ejecutando o continuar con otras cosas en su programa Python. La llamada aPopen
devuelve unPopen
objeto.call
hace bloque. Si bien admite todos los mismos argumentos que elPopen
constructor, por lo que aún puede configurar la salida del proceso, las variables ambientales, etc., su script espera a que se complete el programa ycall
devuelve un código que representa el estado de salida del proceso.es básicamente lo mismo que llamar
call
Es solo una función de conveniencia. Su implementación en CPython está en subprocess.py :Como puede ver, es una envoltura delgada
Popen
.fuente
La otra respuesta es muy completa, pero aquí hay una regla general:
call
está bloqueando:Popen
no es bloqueante:fuente