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=Truesi puede. Tener esta opción es uno de los beneficios de subprocess.Popen()y sus funciones auxiliares.
os.systemy subprocess.call/popen/runbloquea / espera a que termine el comando: stackoverflow.com/a/14059648/4752883
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.
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.