web-dev-qa-db-fra.com

comment exécuter une commande bash dans un script python

Comment puis-je lancer une commande bash avec plusieurs arguments (par exemple "Sudo apt update ") à partir d'un script python?

16
Dremor

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()
19
Anthon

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])
8
Razor

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"])
7
Milind Dumbare

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
2
ricardo130

tiliser le module de sous-processus

import subprocess
command = 'Sudo apt update'
subprocess.check_call(command.split())
0
Fred

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")
0
apogoreliy