Comment exécuter des commandes externes en Python

Comment exécuter des commandes externes en Python
Comment exécuter des commandes externes en Python

Exécuter des commandes système à partir de Python

Python offre de puissantes fonctionnalités pour exécuter des programmes externes et des commandes système directement à partir de vos scripts. Cette fonctionnalité vous permet de tirer parti de la simplicité de Python tout en profitant de la vaste gamme d’outils disponibles dans votre système d’exploitation.

Que vous automatisiez des tâches répétitives ou intégriez des flux de travail complexes, comprendre comment appeler des commandes système en Python peut améliorer considérablement votre productivité. Dans ce guide, nous explorerons différentes méthodes pour y parvenir efficacement.

Commande Description
subprocess.run Exécute une commande dans un sous-shell. Peut capturer les résultats et les erreurs.
subprocess.run([...], capture_output=True) Capture la sortie standard et l’erreur standard de la commande exécutée.
subprocess.run([...], shell=True) Exécute la commande via le shell, autorisant les fonctionnalités du shell telles que les caractères génériques.
subprocess.Popen Exécute une commande dans un nouveau processus, offrant plus de contrôle sur son exécution.
process.stdout.readline() Lit une ligne de sortie à partir de la sortie standard du processus.
os.system Exécute une commande dans un sous-shell, couramment utilisé pour l'exécution de commandes simples.
subprocess.check_output Exécute une commande et renvoie sa sortie. Lève une exception si la commande échoue.
os.environ.copy() Crée une copie des variables d'environnement actuelles, permettant les modifications.
env parameter in subprocess.run Spécifie les variables d'environnement pour le nouveau processus.

Comprendre l'exécution de scripts en Python

Les scripts fournis démontrent différentes manières d'exécuter des commandes externes à l'aide de Python. Le subprocess.run La commande est polyvalente, vous permettant d'exécuter des commandes shell directement à partir de votre script Python. Par exemple, subprocess.run(['echo', 'Hello, World!']) imprime un message sur la console, tandis que subprocess.run(['ls', '-l'], capture_output=True, text=True) capture la sortie du ls -l commande, affichant une liste détaillée du répertoire. En utilisant shell=True avec subprocess.run permet l'utilisation de fonctionnalités du shell, comme l'expansion des caractères génériques, ce qui le rend pratique pour les commandes plus complexes.

Le subprocess.Popen La commande offre plus de contrôle sur l’exécution des commandes en permettant l’exécution de commandes asynchrones et l’interaction avec les flux d’entrée et de sortie du processus. Par exemple, l'exemple de script avec subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) envoie une requête ping en continu à la machine locale et lit chaque ligne de sortie. En plus, os.system est utilisé pour l’exécution simple de commandes mais n’a pas la flexibilité de subprocess. Les variables d'environnement peuvent être modifiées et transmises au sous-processus en utilisant dix et le env paramètre dans subprocess.run, permettant l'exécution de commandes dynamiques en fonction de l'environnement.

Exécuter des commandes externes en Python

Utilisation du module de sous-processus de Python

import subprocess
# Example 1: Running a simple shell command
subprocess.run(['echo', 'Hello, World!'])
# Example 2: Capturing the output of a command
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
# Example 3: Running a command with shell=True
subprocess.run('echo Hello from the shell', shell=True)
# Example 4: Checking the return code
result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True)
if result.returncode != 0:
    print('Command failed')
# Example 5: Using subprocess.Popen for more control
process = subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE)
while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.strip().decode())

Automatisation des tâches système avec Python

Utilisation des modules os.system et sous-processus

import os
import subprocess
# Example 1: Using os.system to run a command
os.system('echo This is a test')
# Example 2: Running a command and capturing output with subprocess
result = subprocess.run(['date'], capture_output=True, text=True)
print('Current date and time:', result.stdout)
# Example 3: Executing multiple commands
commands = ['echo First command', 'echo Second command']
for cmd in commands:
    os.system(cmd)
# Example 4: Running a command with environment variables
env = os.environ.copy()
env['MY_VAR'] = 'Hello'
subprocess.run('echo $MY_VAR', shell=True, env=env)
# Example 5: Handling command errors
try:
    subprocess.check_output(['false_command'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print('An error occurred:', e.output.decode())

Techniques avancées pour l'exécution des commandes système

Un autre aspect de l'exécution de commandes système en Python implique l'utilisation du shlex module pour gérer l’analyse des commandes shell. Ce module fournit un moyen de diviser les commandes shell dans un format de liste, qui peut ensuite être transmis à subprocess les fonctions. Cela garantit que les arguments contenant des espaces sont traités correctement. De plus, vous pouvez utiliser le subprocess.PIPE pour diriger les flux d'entrée, de sortie et d'erreur standard vers le processus parent, permettant une communication inter-processus plus complexe.

Par exemple, le chaînage des commandes et le traitement de leur sortie de manière séquentielle peuvent être réalisés en redirigeant la sortie d'une commande vers une autre en utilisant subprocess.Popen. Cela vous permet de créer des séquences de commandes puissantes similaires à ce que vous feriez dans un script shell. Vous pouvez aussi utiliser threading pour exécuter plusieurs commandes de sous-processus simultanément, améliorant ainsi l'efficacité de votre script, en particulier lorsqu'il s'agit de tâches liées aux E/S.

Foire aux questions sur l'exécution de commandes système en Python

  1. Comment puis-je exécuter une commande shell et obtenir sa sortie en Python ?
  2. Utiliser subprocess.run avec capture_output=True pour capturer la sortie de la commande.
  3. Quelle est la différence entre subprocess.run et subprocess.Popen?
  4. subprocess.run est une interface plus simple qui attend la fin de la commande, tandis que subprocess.Popen donne plus de contrôle sur l'exécution des commandes, permettant un fonctionnement asynchrone.
  5. Comment gérer les erreurs lors de l’exécution d’une commande système ?
  6. Utiliser try et except blocs avec subprocess.CalledProcessError pour détecter et gérer les erreurs.
  7. Puis-je transmettre des variables d’environnement à une commande ?
  8. Oui, utilisez le env paramètre dans subprocess.run ou subprocess.Popen pour transmettre des variables d'environnement.
  9. Comment exécuter plusieurs commandes en séquence ?
  10. Utiliser subprocess.run ou subprocess.Popen dans une boucle ou une chaîne de commandes en utilisant des tuyaux avec subprocess.Popen.
  11. Comment puis-je exécuter une commande qui nécessite une intervention de l'utilisateur ?
  12. Utiliser subprocess.Popen avec stdin=subprocess.PIPE et communiquer avec le processus en utilisant process.communicate.
  13. A quoi sert shlex dans l'exécution des commandes ?
  14. shlex aide à analyser correctement les commandes shell, garantissant que les arguments avec des espaces sont gérés correctement.
  15. Comment exécuter une commande en arrière-plan ?
  16. Utiliser subprocess.Popen sans attendre la fin du processus, ni utiliser threading pour gérer l’exécution en arrière-plan.

Techniques avancées pour l'exécution des commandes système

Un autre aspect de l'exécution de commandes système en Python implique l'utilisation du shlex module pour gérer l’analyse des commandes shell. Ce module fournit un moyen de diviser les commandes shell dans un format de liste, qui peut ensuite être transmis à subprocess les fonctions. Cela garantit que les arguments contenant des espaces sont traités correctement. De plus, vous pouvez utiliser le subprocess.PIPE pour diriger les flux d'entrée, de sortie et d'erreur standard vers le processus parent, permettant une communication inter-processus plus complexe.

Par exemple, le chaînage des commandes et le traitement de leur sortie de manière séquentielle peuvent être réalisés en redirigeant la sortie d'une commande vers une autre en utilisant subprocess.Popen. Cela vous permet de créer des séquences de commandes puissantes similaires à ce que vous feriez dans un script shell. Vous pouvez aussi utiliser threading pour exécuter plusieurs commandes de sous-processus simultanément, améliorant ainsi l'efficacité de votre script, en particulier lorsqu'il s'agit de tâches liées aux E/S.

Réflexions finales sur l'exécution de commandes en Python

L'exécution de commandes externes en Python est une fonctionnalité polyvalente et puissante qui peut considérablement améliorer vos tâches de script et d'automatisation. En utilisant le subprocess module, vous pouvez exécuter des commandes shell, capturer leurs sorties et gérer efficacement les erreurs. Le os.system La fonction fournit une alternative plus simple pour l’exécution de commandes de base. De plus, en intégrant le shlex Le module garantit une analyse correcte des commandes shell complexes. Comprendre ces techniques vous permet d'exploiter les atouts de Python tout en utilisant tout le potentiel des outils de ligne de commande de votre système d'exploitation.