Réponses:
La réponse de @ milne fonctionne, mais subprocess.call()
vous donne peu de commentaires.
Je préfère utiliser subprocess.check_output()
afin que vous puissiez analyser ce qui a été imprimé sur stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
renvoie une erreur lors de la sortie à zéro de la commande invoquée
Veuillez noter que cela n'invoque pas bash
ou un autre shell si vous ne spécifiez pas l' shell
argument mot - clé de la fonction (la même chose est vraie pour subprocess.call()
, et vous ne devriez pas si ce n'est pas nécessaire car cela impose un risque pour la sécurité), il invoque directement le commander.
Si vous vous retrouvez à faire de nombreuses (différentes) invocations de commandes à partir de Python, vous voudrez peut-être regarder Plumbum . Avec cela, vous pouvez faire le (IMO) plus lisible:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
ou os.system
), ex res = os.popen('sudo apt update').read()
:? @Anthon
subprocess
bien os.system
et os.popen
déjà existé. Ces PEP ne sont pas triviaux pour être acceptés. Plusieurs personnes y ont réfléchi beaucoup plus que vous ou moi. Et subprocess
s'est amélioré depuis 2003, les autres sont toujours là pour la compatibilité descendante. Avez-vous redéfini la os.system
page de manuel: 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.
sudo
ne fera qu'aggraver la situation. Peut-être que l'utilisation de python-apt est une meilleure solution (je n'ai pas étudié cela moi-même).
Le module de sous-processus est conçu pour ce faire:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Si vous souhaitez que le script se termine si la commande échoue, vous pouvez envisager d'utiliser check_call()
au lieu d'analyser le code retour vous-même:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(j'utilise yum car j'utilise Fedora comme OS principal)
subprocess.call()
blocage est tout en subprocess.Popen()
non-blocage ..
Vous pouvez également utiliser 'os.popen'.
Exemple:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Production:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
utiliser le module de sous-processus
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())