Quelle est la différence entre subprocess.Popen()
et os.system()
?
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.
subprocess.Popen()
est un super-ensemble strict de os.system()
.
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.
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:
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.