HOWTO · Python
Comment exécuter une commande Bash en Python
Ce tutoriel montre comment exécuter des commandes bash en Python, en se concentrant sur les commandes Git. Découvrez les meilleures méthodes, notamment subprocess et os.system, pour exécuter des commandes efficacement. Améliorez votre flux de travail grâce à des exemples pratiques et des explications claires. Parfait pour les développeurs qui cherchent à automatiser des tâches et à rationaliser leurs processus.
Sur cette page
Python peut lancer des programmes en ligne de commande et des commandes shell pour des tâches telles que la création de répertoires ou l’utilisation de Git. Pour les commandes qui se terminent, subprocess.run() est généralement le meilleur point de départ : il peut capturer la sortie et les erreurs et fournit un code de retour. Utilisez os.system() pour les cas simples qui ne nécessitent pas de sortie capturée, et choisissez subprocess.Popen() lorsque vous devez interagir avec un processus pendant son exécution.
Exécuter une commande avec subprocess.run()
Passez une séquence d’arguments pour invoquer directement un exécutable. Cela évite de demander à un shell d’analyser la commande. L’exemple utilise l’interpréteur Python en cours d’exécution, il ne dépend donc ni de l’installation de Git ni d’un shell particulier.
import subprocess
import sys
result = subprocess.run(
[sys.executable, "-c", "print('Hello from Python')"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
print("stdout:", result.stdout)
print("stderr:", result.stderr)
print("return code:", result.returncode)
stdout: b'Hello from Python\n'
stderr: b''
return code: 0
stdout et stderr sont ici des octets (bytes), et returncode est un entier. Un code de retour de 0 indique conventionnellement un succès ; une valeur non nulle signale que le programme a signalé un problème. Vous pouvez le vérifier vous-même ou passer check=True pour que run() lève CalledProcessError en cas de code de retour non nul. Pour exécuter Git, par exemple, passez une liste d’arguments telle que ['git', 'status'] ; sa sortie dépend du dépôt et doit être traitée comme des données, sans supposer qu’elle a un contenu fixe.
L’invocation d’un programme n’est pas automatiquement une commande Bash. Une syntaxe shell comme les tubes (pipes), les redirections ou && nécessite un shell. Définir shell=True demande à Python d’utiliser le shell de la plateforme ; cela ne garantit pas Bash. Évitez d’interpoler des entrées non fiables dans une commande shell, car cela peut permettre l’injection de commandes.
Exécuter une commande shell avec os.system()
os.system() est une option limitée pour une commande simple lorsque vous n’avez pas besoin de capturer sa sortie ni de gérer les erreurs en détail. Par exemple, os.system("mkdir reports") demande au shell de la plateforme d’exécuter la commande de création du répertoire. La commande écrit dans les flux de console hérités. La fonction renvoie une valeur de statut, et non la sortie ordinaire de la commande ; l’interprétation de ce statut peut varier selon la plateforme. Préférez subprocess.run() lorsque vous devez inspecter de façon cohérente la sortie capturée, les erreurs ou un code de retour.
Utiliser subprocess.Popen() pour les processus en cours
Utilisez subprocess.Popen() lorsque le programme a besoin d’une entrée ou d’une autre interaction avant de se terminer. Il démarre le processus et donne à votre code un objet processus avec lequel travailler. Pour un processus dont la sortie est bornée, définissez stdout=subprocess.PIPE et stderr=subprocess.PIPE, puis appelez communicate() pour lire ces flux et attendre la fin. Les valeurs de flux renvoyées sont des octets, sauf si vous organisez le décodage séparément.
communicate() est utile lorsque le processus va se terminer et que sa sortie capturée peut tenir en mémoire. Ce n’est pas une approche de diffusion (streaming) pour une sortie illimitée. Une fois communicate() terminé, le processus est fini ; il n’est pas nécessaire d’appeler kill() ou terminate() dessus. Pour les commandes ordinaires qui se terminent simplement, run() offre l’interface la plus simple.
Choisir la bonne méthode
Utilisez subprocess.run() pour la plupart des commandes : passez une liste d’arguments, capturez les flux si nécessaire et inspectez returncode. N’utilisez os.system() que lorsqu’une courte commande shell suffit et que sa sortie et son statut détaillé sont sans importance. Utilisez Popen() lorsque votre programme doit gérer un processus en cours d’exécution ou échanger des données avec lui. Ne choisissez un shell que lorsque la commande nécessite une syntaxe shell, et gardez les valeurs non fiables hors des chaînes shell interpolées.