Diferencia entre subprocess.Popen y os.system

Respuestas:

99

Si consulta la sección de subprocesos de los documentos de Python , notará que hay un ejemplo de cómo reemplazar os.system()con subprocess.Popen():

sts = os.system("mycmd" + " myarg")

... hace lo mismo que ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

El código "mejorado" parece más complicado, pero es mejor porque una vez que lo sabes subprocess.Popen(), no necesitas nada más. subprocess.Popen()reemplaza varias otras herramientas ( os.system()es solo una de esas) que estaban dispersas en otros tres módulos de Python.

Si le ayuda, piense subprocess.Popen()en un dispositivo muy flexible os.system().

Jacob mármol
fuente
También puede utilizar en sts = p.wait()lugar de la última línea.
Sven Marnach
1
@JacobMarble, así que suponga que estoy llamando a un script de raspado de selenio desde otro script de Python, ¿cuál de estos me permitiría completar el script de raspado y luego y solo entonces ejecutar la siguiente línea de código? Como en, mi raspado debería completarse antes de que la ejecución pueda continuar.
Prakhar Mohan Srivastava
Tal vez también mencione stackoverflow.com/questions/3172470/… para señalar que debe evitar el shell=Truesi puede. Tener esta opción es uno de los beneficios de subprocess.Popen()y sus funciones auxiliares.
tripleee
@PrakharMohanSrivastava Si desea bloquear el flujo y esperar a que el comando complete su trabajo, consulte: stackoverflow.com/a/2837319/5252192
AmirHossein
@PrakharMohanSrivastava, en general ambos os.systemy subprocess.call/popen/runbloquea / espera a que termine el comando: stackoverflow.com/a/14059648/4752883
alpha_989
47

subprocess.Popen()es un superconjunto estricto de os.system().

Jan Hudec
fuente
10
Esta es la respuesta elegante completa.
Farsheed
23

os.systemes equivalente al systemcomando Unix , mientras que subprocessera un módulo auxiliar creado para proporcionar muchas de las facilidades proporcionadas por los Popencomandos con una interfaz más fácil y controlable. Fueron diseñados de manera similar al comando Unix Popen .

system()ejecuta un comando especificado en comando llamando /bin/sh -c commandy regresa después de que el comando se ha completado

Mientras:

La popen()función abre un proceso creando una tubería, bifurcando e invocando el shell.

Si está pensando cuál usar, utilícelo subprocessdefinitivamente porque tiene todas las facilidades para la ejecución, además de un control adicional sobre el proceso.

Senthil Kumaran
fuente
bien ... entonces ¿hay alguna forma de que pueda ejecutar os.system y popen en Windows env? Soy un novato y necesito profundizar ...
Arovit
Sí, puede utilizar os.system y subprocess en el entorno de Windows. Eche un vistazo a los tutoriales básicos de effbot.org (libro en línea de la biblioteca estándar de Python)
Senthil Kumaran
Cuidado: si está ejecutando en sistemas más antiguos, el módulo de subproceso no está disponible.
Steve Hanov
21

El subproceso se basa en popen2 y, como tal, tiene una serie de ventajas: aquí hay una lista completa en el PEP , pero algunas son:

  • usando tubería en la cáscara
  • mejor soporte de nueva línea
  • mejor manejo de excepciones
Andy Mikula
fuente
2

Cuando se ejecuta python (cpython) en Windows, <built-in function system> os.system se ejecutará bajo las cortinas _wsystem, mientras que si está utilizando un sistema operativo que no sea Windows, utilizará system .

Por el contrario, Popen debería usar CreateProcess en Windows y _posixsubprocess.fork_exec en sistemas operativos basados ​​en posix.

Dicho esto, un consejo importante proviene de os.system docs, que dice:

El módulo de subprocesos proporciona instalaciones más potentes para generar nuevos procesos y recuperar sus resultados; Es preferible usar ese módulo que usar esta función. Consulte la sección Reemplazo de funciones anteriores con el módulo de subproceso en la documentación del subproceso para obtener algunas recetas útiles.

BPL
fuente