Différence entre subprocess.Popen et os.system


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


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


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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.