Module subprocess de Python

subprocessest un module de la bibliothèque standard Python utilisé pour créer et gérer des sous-processus.

subprocessIl vous permet d'exécuter des commandes externes dans des programmes Python et d'interagir avec ces commandes.

Viasubprocessle module, vous pouvez exécuter des commandes système, appeler d'autres programmes et obtenir leur sortie ou leurs messages d'erreur.

Pourquoi utiliser le module subprocess ?

En Python, il est parfois nécessaire d'exécuter des commandes système ou d'appeler d'autres programmes pour accomplir des tâches spécifiques. Par exemple, vous pouvez avoir besoin d'exécuter une commande shell, de lancer une application externe ou d'interagir avec un outil en ligne de commande.subprocessLe module offre un moyen sûr et flexible de répondre à ces besoins.

Par rapport auxos.system()ouos.popen()approches,subprocessle module offre des fonctionnalités plus puissantes et un meilleur contrôle. Il vous permet de gérer plus finement les flux d'entrée, de sortie et d'erreur des sous-processus, et peut gérer des scénarios plus complexes.


Fonctionnalités principales du module subprocess

1. Exécuter des commandes externes

subprocess.run()OuisubprocessL'une des fonctions les plus couramment utilisées du module. Elle peut exécuter une commande externe et attendre que la commande se termine. Voici un exemple simple :

Exemple

import subprocess

# Exécuter une commande shell simple
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# Afficher la sortie de la commande
print(result.stdout)

Dans cet exemple,subprocess.run()a exécuté lals -lcommande et capturé la sortie dansresult.stdoutle résultat.

2. Gérer l'entrée et la sortie

subprocessLe module vous permet de contrôler les flux d'entrée, de sortie et d'erreur des sous-processus. Vous pouvez transmettre des données à l'entrée standard d'un sous-processus, ou lire des données à partir de la sortie standard et de l'erreur standard d'un sous-processus. Voici un exemple :

Exemple

import subprocess

# Exécuter une commande et transmettre l'entrée au sous-processus
result = subprocess.run(['grep', 'python'], input='hello\npython\nworld', capture_output=True, text=True)

# Afficher la sortie de la commande
print(result.stdout)

Dans cet exemple,subprocess.run()a exécuté lagrep pythoncommande et avons passé la chaîne'hello\npython\nworld'comme entrée du sous-processus.

3. Gérer les erreurs

subprocessLe module vous permet également de gérer les erreurs des sous-processus. Si un sous-processus renvoie un code de statut de sortie non nul,subprocess.run()il lèvera uneCalledProcessErrorexception.result.returncodeVous pouvez vérifier

Exemple

import subprocess

try:
    result = subprocess.run(['ls', 'nonexistent_file'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"Command failed with return code {e.returncode}")
    print(f"Error output: {e.stderr}")

Exemplesubprocess.run()Dans cet exemple,ls nonexistent_filea exécuté laCalledProcessErrorcommande. Comme le fichier n'existe pas, la commande a échoué et a levé une


Utilisation avancée du module subprocess

1. Utilisation de la classe Popen

subprocess.Popen1. Utilisation de la classe PopenPopenLa classe fournit une interface de plus bas niveau qui vous permet de contrôler les sous-processus de manière plus flexible. Vous pouvez utiliser

Exemple

import subprocess

Exemple
process = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE, text=True)

# Démarrer un sous-processus
while True:
    output = process.stdout.readline()
    if output == '' and process.poll() is not None:
        break
    if output:
        print(output.strip())

# Lire la sortie du sous-processus
return_code = process.poll()
print(f"Processus terminé avec le code de retour {return_code}")

# Obtenir le code de sortie du sous-processussubprocess.PopenDans cet exemple,ping google.coma démarré un

2. Utilisation des tubes

subprocess2. Utilisation des tubes

Exemple

import subprocess

Exemple
p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'py'], stdin=p1.stdout, stdout=subprocess.PIPE, text=True)

# Utiliser un tube pour connecter deux commandes
output = p2.communicate()[0]
print(output)

# Obtenir la sortie finalels -lDans cet exemple,grep pyla sortie de la commande est transmise àpycommande, et la sortie finale contient


Méthodes, classes et paramètres courants du module subprocess

Ce qui suit est une description des méthodes, classes et paramètres courants du module subprocess de Python, incluant les descriptions fonctionnelles et des exemples :

Méthodes principales du module subprocess

MéthodeDescriptionExemple
subprocess.run()Exécuter une commande et attendre la fin (recommandé)subprocess.run(["ls", "-l"], capture_output=True, text=True)
subprocess.Popen()Créer un sous-processus (contrôle de bas niveau)proc = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE)
subprocess.call()Exécuter une commande et renvoyer le code de sortie (ancienne méthode)exit_code = subprocess.call(["python", "--version"])
subprocess.check_call()Exécuter une commande et lever une exception en cas d'échecsubprocess.check_call(["git", "commit"])
subprocess.check_output()Exécuter une commande et renvoyer la sortie (ancienne méthode)output = subprocess.check_output(["date"], text=True)

Attributs de l'objet subprocess.CompletedProcess (objet de retour de la méthode run())

AttributDescription
argsListe des arguments de la commande exécutée
returncodeCode de statut de sortie du processus (0 indique le succès)
stdoutContenu de la sortie standard (si définicapture_output)
stderrContenu de l'erreur standard (si définicapture_output)

Méthodes/attributs courants de la classe subprocess.Popen

Méthode/AttributDescriptionExemple
poll()Vérifie si le processus est terminé (renvoieNoneTrue pour indiquer qu'il est en cours d'exécution)if proc.poll() is None: print("Running")
wait()Bloque jusqu'à la fin du processusproc.wait()
communicate()Entrée/sortie interactivestdout, stderr = proc.communicate(input="data")
terminate()Envoyer le signal de terminaison (SIGTERM)proc.terminate()
kill()Terminer de force le processus (SIGKILL)proc.kill()
stdinLe flux d'entrée standard du processusproc.stdin.write("input")
stdoutLe flux de sortie standard du processusprint(proc.stdout.read())
stderrLe flux d'erreur standard du processuserrors = proc.stderr.read()

Descriptions des paramètres communs (applicables à run() et Popen())

ParamètreDescriptionValeur d'exemple
argsCommande (liste ou chaîne)["ls", "-l"]ou"ls -l"
stdinConfiguration de l'entrée standardsubprocess.PIPE(pipe),None(inherit)
stdoutConfiguration de la sortie standardsubprocess.PIPE、open('log.txt', 'w')
stderrConfiguration de l'erreur standardsubprocess.STDOUT(fusionné dans stdout)
shellIndique s'il faut exécuter via ShellTrue(prend en charge les commandes sous forme de chaîne)
cwdChemin du répertoire de travail"/tmp"
envVariables d'environnement personnalisées{"PATH": "/usr/bin"}
timeoutDélai d'attente (secondes)30
textIndique si l'entrée/sortie est une chaîne (pas des octets)True

Exemple

Exécuter une commande et capturer la sortie :

Exemple

result = subprocess.run(["echo", "Hello"], capture_output=True, text=True)
print(result.stdout)  # Sortie : "Hello\n"

Exécuter des commandes complexes via le shell :

subprocess.run("grep 'error' log.txt | wc -l", shell=True, check=True)
Obtenir le flux de sortie en temps réel :

Exemple

proc = subprocess.Popen(["tail", "-f", "log.txt"], stdout=subprocess.PIPE)
while True:
    line = proc.stdout.readline()
    if not line: break
    print(line.decode().strip())

Contrôle du délai d'attente :

Exemple

try:
    subprocess.run(["sleep", "10"], timeout=5)
except subprocess.TimeoutExpired:
    print("La commande a expiré !")
Autres extensions