Réponses:
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()
.
shell=True
si vous le pouvez. Avoir cette option est l'un des avantages de subprocess.Popen()
et de ses fonctions d'assistance.
os.system
et subprocess.call/popen/run
bloque / attend la fin de la commande: stackoverflow.com/a/14059648/4752883
os.system
équivaut à la system
commande Unix , alors subprocess
qu'un module d'aide a été créé pour fournir de nombreuses fonctionnalités fournies par les Popen
commandes 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 subprocess
définitivement car vous disposez de toutes les fonctionnalités pour l'exécution, ainsi que d'un contrôle supplémentaire sur le processus.
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:
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.
sts = p.wait()
place de la dernière ligne.