Différence entre subprocess.Popen et os.system

117

Quelle est la différence entre subprocess.Popen()et os.system()?

Arovit
la source

Réponses:

99

Si vous consultez la section sous-processus de la documentation Python , vous remarquerez qu'il existe un exemple de remplacement os.system()par subprocess.Popen():

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

... fait la même chose que ...

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

Le code "amélioré" semble plus compliqué, mais c'est mieux car une fois que vous savez subprocess.Popen(), vous n'avez besoin de rien d'autre. subprocess.Popen()remplace plusieurs autres outils ( os.system()n'est qu'un de ceux-ci) qui étaient dispersés dans trois autres modules Python.

Si cela aide, considérez-le subprocess.Popen()comme très flexible os.system().

Marbre Jacob
la source
Vous pouvez également utiliser à la sts = p.wait()place de la dernière ligne.
Sven Marnach le
1
@JacobMarble alors supposons que j'appelle un script de raclage de sélénium à partir d'un autre script python, lequel de ceux-ci me permettrait de terminer le script de raclage et d'exécuter ensuite la ligne de code suivante? Comme dans, mon grattage devrait se terminer avant que l'exécution puisse continuer.
Prakhar Mohan Srivastava
Peut-être aussi mentionner stackoverflow.com/questions/3172470/… pour souligner que vous devriez éviter le shell=Truesi vous le pouvez. Avoir cette option est l'un des avantages de subprocess.Popen()et de ses fonctions d'assistance.
tripleee
@PrakharMohanSrivastava Si vous souhaitez bloquer le flux et attendre que la commande termine son travail, consultez: stackoverflow.com/a/2837319/5252192
AmirHossein
@PrakharMohanSrivastava, en général à la fois os.systemet subprocess.call/popen/runbloque / attend la fin de la commande: stackoverflow.com/a/14059648/4752883
alpha_989
47

subprocess.Popen()est un super-ensemble strict de os.system().

Jan Hudec
la source
10
C'est la réponse élégante et complète.
Farsheed
23

os.systeméquivaut à la systemcommande Unix , alors subprocessqu'un module d'aide a été créé pour fournir de nombreuses fonctionnalités fournies par les Popencommandes avec une interface plus facile et contrôlable. Ceux-ci ont été conçus de manière similaire à la commande Unix Popen .

system()exécute une commande spécifiée dans la commande en appelant /bin/sh -c command, et retourne une fois la commande terminée

Tandis que:

La popen()fonction ouvre un processus en créant un tube, en forçant et en invoquant le shell.

Si vous pensez lequel utiliser, utilisez subprocessdéfinitivement car vous disposez de toutes les fonctionnalités pour l'exécution, ainsi que d'un contrôle supplémentaire sur le processus.

Senthil Kumaran
la source
ok .. alors est-il possible que je puisse exécuter à la fois os.system et popen dans windows env? Je suis un débutant et j'ai besoin de creuser plus profondément ..
Arovit
Oui, vous pouvez utiliser à la fois os.system et sous-processus dans l'environnement Windows. Jetez un œil aux didacticiels de base de effbot.org (livre en ligne Python Standard Library)
Senthil Kumaran
Attention - si vous utilisez des systèmes plus anciens, le module de sous-processus n'est pas disponible.
Steve Hanov
21

Le sous-processus est basé sur popen2 et, en tant que tel, présente un certain nombre d'avantages - il y a une liste complète dans le PEP ici , mais certains sont:

  • en utilisant un tuyau dans la coque
  • meilleur support de nouvelle ligne
  • meilleure gestion des exceptions
Andy Mikula
la source
2

Lors de l'exécution de python (cpython) sur Windows, <built-in function system> os.system s'exécutera sous les rideaux _wsystem tandis que si vous utilisez un système d'exploitation non Windows, il utilisera system .

Au contraire, Popen devrait utiliser CreateProcess sur Windows et _posixsubprocess.fork_exec dans les systèmes d'exploitation basés sur Posix .

Cela dit, un conseil important provient de la documentation os.system , qui dit:

Le module de sous-processus fournit des fonctionnalités plus puissantes pour générer de nouveaux processus et récupérer leurs résultats; l'utilisation de ce module est préférable à l'utilisation de cette fonction. Consultez la section Remplacement d'anciennes fonctions par le module de sous-processus dans la documentation du sous-processus pour quelques recettes utiles.

BPL
la source