¿Cuál es la diferencia entre subprocess.Popen() y os.system()?Diferencia entre subprocess.Popen y os.system
Respuesta
Si compruebas el subprocess section of the Python docs, se dará cuenta de que hay un ejemplo de cómo sustituir os.system()
con subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... hace lo mismo que ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
La "mejora" código es más complicado, pero es mejor, porque una vez que sabes subprocess.Popen()
, no es necesario nada más. subprocess.Popen()
reemplaza a varias otras herramientas (os.system()
es solo una de ellas) que estaban dispersas en otros tres módulos de Python.
Si ayuda, piense en subprocess.Popen()
como un muy flexible os.system()
.
Subprocess se basa en popen2, y como tal tiene un número de ventajas - hay una lista completa en la PEP here, pero algunos son:
- utilizando tubería en la cáscara apoyo
- mejor salto de línea
- mejor manejo de excepciones
subproceso.Popen() es un superconjunto estricto de os.system().
Esta es la respuesta elegante completa. – Farsheed
os.system es equivalente al comando Unix system, mientras que el subproceso fue un módulo auxiliar creado para proporcionar muchas de las facilidades proporcionadas por los comandos Popen con una interfaz más fácil y controlable. Esos fueron diseñados similares al comando Unix Popen.
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed
donde como
The popen() function opens a process by creating a pipe, forking, and invoking the shell.
Si usted está pensando, cuál utilizar, a continuación, utilizar subproceso duda porque tiene todas las facilidades para la ejecución, además de un control adicional sobre el proceso.
okay ... entonces ¿hay alguna manera de que pueda ejecutar tanto os.system como popen en windows env ? Soy un novato y necesito profundizar. – Arovit
Sí, puede usar tanto el sistema os.system como el subproceso en Windows Environment. Eche un vistazo a los tutoriales básicos de effbot.org (libro en línea de la biblioteca estándar de Python) –
Cuidado: si se está ejecutando en sistemas más antiguos, el módulo de subproceso no está disponible. –
Cuando se ejecuta pitón (CPython) en las ventanas del <built-in function system>
os.system ejecutará bajo las cortinas _wsystem mientras que si está utilizando un sistema operativo que no sea Windows, que va a utilizar system.
Por el contrario, Popen debería usar CreateProcess en Windows y _posixsubprocess.fork_exec en sistemas operativos basados en posix.
Dicho esto, una pieza importante del consejo viene de os.system docs, que dice:
El módulo subproceso ofrece unas instalaciones más potentes para el desove nuevos procesos y la recuperación de sus resultados; usar ese módulo es preferible al uso de esta función. Consulte la sección Reemplazo de funciones anteriores con la sección Módulo de subprocesos en la documentación del subproceso para algunas recetas útiles.
- 1. ¿Por qué este comando funciona con os.system() pero no subprocess.Popen()?
- 2. MySQL: diferencia entre ', `,' y"
- 3. Diferencia entre objeto y *?
- 4. Diferencia entre. y #
- 5. ¿Diferencia entre == y caso?
- 6. La diferencia entre $ * y $ @
- 7. Diferencia entre & y &
- 8. Python: ulimit y agradable para subprocess.call/subprocess.Popen?
- 9. VBA: Diferencia entre y y +
- 10. subprocess.Popen y shlex.split formato en windows y linux
- 11. pushd through os.system
- 12. Diferencia entre -Wconversion entre gcc y g ++
- 13. Diferencia entre decimal y decimal
- 14. ¿Diferencia entre trazo y relleno?
- 15. Diferencia entre interrupción y eventos
- 16. Diferencia entre netTcpContextBinding y netTcpBinding
- 17. ¿Diferencia entre brújula y sass?
- 18. Diferencia entre "__method__" y "método"
- 19. Diferencia entre Mealy y Moore
- 20. Diferencia entre HashSet y HashMap?
- 21. diferencia entre ajax y enviar
- 22. Diferencia entre sistema y shell_exec
- 23. Diferencia entre Style y ControlTemplate
- 24. Diferencia entre relativo y absoluto
- 25. Diferencia entre window.location.href y top.location.href
- 26. Diferencia entre strncpy y memcpy?
- 27. diferencia entre SDL y GLUT
- 28. Diferencia entre Javascript y PHP
- 29. Diferencia entre Session y HttpContext.Current.Session
- 30. diferencia entre px y em
También puede usar 'sts = p.wait()' en lugar de la última línea. –
@JacobMarble así que supongo que estoy llamando a un script de raspado de selenio de 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 debe completarse antes de que la ejecución pueda continuar. –
Tal vez también mencione http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess para señalar que debe evitar 'shell = True' si puede. Tener esta opción es uno de los beneficios de 'subprocess.Popen()' y sus funciones auxiliares. – tripleee