Respuestas:
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()
.
shell=True
si puede. Tener esta opción es uno de los beneficios de subprocess.Popen()
y sus funciones auxiliares.
os.system
y subprocess.call/popen/run
bloquea / espera a que termine el comando: stackoverflow.com/a/14059648/4752883
os.system
es equivalente al system
comando Unix , mientras que subprocess
era un módulo auxiliar creado para proporcionar muchas de las facilidades proporcionadas por los Popen
comandos 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 command
y 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 subprocess
definitivamente porque tiene todas las facilidades para la ejecución, además de un control adicional sobre el proceso.
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:
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.
sts = p.wait()
lugar de la última línea.