2011-01-27 32 views

Respuesta

58

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().

+0

También puede usar 'sts = p.wait()' en lugar de la última línea. –

+1

@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. –

+0

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

19

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
22

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

+0

Esta es la respuesta elegante completa. – Farsheed

18

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.

+0

okay ... entonces ¿hay alguna manera de que pueda ejecutar tanto os.system como popen en windows env ? Soy un novato y necesito profundizar. – Arovit

+0

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) –

+0

Cuidado: si se está ejecutando en sistemas más antiguos, el módulo de subproceso no está disponible. –

0

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.