web-dev-qa-db-fra.com

Différence entre subprocess.Popen et os.system

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

94
Arovit

Si vous extrayez la section section de sous-processus de Python docs , === docs) ==, vous remarquerez qu'il existe un exemple illustrant comment remplacer 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'en est qu'un) qui ont été dispersés dans trois autres Python modules.

Si cela vous aide, pensez à subprocess.Popen() comme à un os.system() très flexible.

85
Jacob Marble

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

39
Jan Hudec

os.system est équivalent à la commande Unix system , alors que subprocess était un module auxiliaire créé pour fournir à la plupart des fonctionnalités fournies par les commandes Popen une interface plus simple et contrôlable. Celles-ci ont été conçues de manière similaire à la commande nix Popen .

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

tandis que

The popen() function opens a process by creating a pipe, forking, and invoking the Shell.

Si vous pensez lequel utiliser, utilisez le sous-processus , car vous disposez de toutes les ressources nécessaires à l'exécution, ainsi que d'un contrôle supplémentaire sur le processus.

21
Senthil Kumaran

Le sous-processus est basé sur popen2 et présente donc de nombreux avantages - il existe une liste complète dans le PEP here , mais certains sont les suivants:

  • utilisant un tuyau dans la coquille
  • meilleur support newline
  • meilleur traitement des exceptions
20
Andy Mikula

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

Au contraire, Popen doit utiliser CreateProcess sur les fenêtres et _ posixsubprocess.fork_exec sur les systèmes d'exploitation posix.

Cela dit, un conseil important vient de os.system docs, qui dit:

Le module de sous-processus offre des fonctionnalités plus puissantes pour générer de nouveaux processus et extraire leurs résultats. L'utilisation de ce module est préférable à l'utilisation de cette fonction. Reportez-vous à la section Remplacement de fonctions plus anciennes avec le module de sous-processus de la documentation de sous-processus pour des recettes utiles.

2
BPL