Module Python Subprocess
Subprocess est un module intégré qui nous permet de lancer de nouveaux processus système, de nous connecter à leurs flux d’entrée/sortie/erreur et d’obtenir leurs codes de retour.
import subprocess
Exécution d’une Commande Système
La fonction run est utilisée pour exécuter une commande système.
subprocess.run(['echo', 'Hello World!'])
Hello World!
Si vous souhaitez exécuter une commande sous forme de chaîne unique au lieu d’une liste, utilisez :
subprocess.run('echo Hello World!', shell=True)
Hello World!
Les deux imprimeront automatiquement la sortie dans le terminal.
ATTENTION
Évitez `shell=True` avec des entrées non fiables (risque d'injection shell).
Capture de la Sortie
Pour capturer la sortie, définissez capture_output à True :
result = subprocess.run(
['echo', 'Hello World!'],
capture_output=True,
text=True
)
output = result.stdout
error = result.stderr
returncode = result.returncode
output = "Hello World!\n"
error = ""
returncode = 0
Ici, text=True indique à la fonction de lire la sortie sous forme de texte au lieu d’octets.
Un returncode de 0 indique le succès ; toute valeur non nulle indique une erreur.
Vérification des Erreurs
Bien que nous puissions vérifier le succès à l’aide du code de retour, il existe une manière plus idiomatique en Python de le faire :
try:
result = subprocess.run(
['ls', 'my_dir'],
check=True,
)
print('Finished without errors.')
except subprocess.CalledProcessError:
print('Error: Directory does not exist.')
Error: Directory does not exist.
Si check est défini sur True et que le code de retour n’est pas 0 (opération infructueuse), subprocess lèvera une subprocess.CalledProcessError, qui peut être gérée de la manière habituelle à l’aide d’un bloc except.
Exécution de Commandes avec Délai d’Attente (Timeout)
Vous pouvez définir un délai d’attente pour un processus. S’il prend plus de temps que le temps spécifié, subprocess.TimeoutExpired est levé :
try:
subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
print('Process took too long!')
Process took too long!
Écriture de la Sortie dans un Fichier
Vous pouvez rediriger la sortie vers un fichier en définissant stdout (et stderr, si nécessaire) sur un objet fichier :
with open('output.txt', 'w') as f:
subprocess.run(['ls', '-l'], stdout=f, stderr=f)
Ici, la sortie normale et les erreurs apparaîtront dans le fichier, dans l’ordre où elles sont générées.
Note : text=True est utile lorsque vous souhaitez manipuler la sortie sous forme de chaîne en Python. Ce n’est pas strictement nécessaire lorsque la sortie est redirigée directement vers un fichier.