Comment puis-je lancer une commande bash avec plusieurs arguments (par exemple "Sudo apt update
") à partir d'un script python?
La réponse de @ milne fonctionne, mais subprocess.call()
vous donne peu de commentaires.
Je préfère utiliser subprocess.check_output()
pour 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'argument de mot clé Shell
à la fonction (il en va de même 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 appelle directement la commande.
Si vous vous retrouvez à faire beaucoup d'invocations de commandes (différentes) à 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()
Il est possible que vous utilisiez le bash comme programme, avec le paramètre -c pour exécuter les commandes:
Exemple:
bashCommand = "Sudo apt update"
output = subprocess.check_output(['bash','-c', bashCommand])
Le module sous-processus est conçu pour cela:
import subprocess
subprocess.call(["Sudo", "apt", "update"])
Si vous souhaitez que le script se termine en cas d'échec de la commande, vous pouvez envisager d'utiliser check_call()
au lieu d'analyser le code retour vous-même:
subprocess.check_call(["Sudo", "apt", "update"])
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
tiliser le module de sous-processus
import subprocess
command = 'Sudo apt update'
subprocess.check_call(command.split())
Pour python 3.5 et plus, vous pouvez utiliser:
import subprocess
try:
result = subprocess.run("Sudo apt update", check=True, Shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as err:
raise Exception(str(err.stderr.decode("utf-8")))
except Exception as err:
raise Exception(err)
else:
return result.stdout.decode("utf-8")