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 bashou un autre shell si vous ne spécifiez pas l' shellargument 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.popenou os.system), ex res = os.popen('sudo apt update').read():? @Anthon
subprocessbien os.systemet os.popendé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 subprocesss'est amélioré depuis 2003, les autres sont toujours là pour la compatibilité descendante. Avez-vous redéfini la os.systempage 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.
sudone 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())