Si vous utilisez Linux, vous aimerez certainement les commandes de l’interpréteur de commandes.
Et si vous travaillez avec Python, vous avez peut-être essayé d’automatiser certaines choses. C’est un moyen de gagner du temps. Vous avez peut-être aussi des scripts bash pour automatiser les choses.
Python est plus pratique pour écrire des scripts que bash. De plus, la gestion des scripts Python est plus facile que celle des scripts bash. Vous aurez du mal à maintenir les scripts bash une fois qu’ils auront pris de l’ampleur.
Mais que se passe-t-il si vous avez déjà des scripts bash que vous souhaitez exécuter avec Python ?
Existe-t-il un moyen d’exécuter les commandes et les scripts bash dans Python ?
Oui, Python dispose d’un module intégré appelé subprocess qui est utilisé pour exécuter les commandes et les scripts à l’intérieur des scripts Python. Voyons en détail comment exécuter des commandes et des scripts bash dans des scripts Python.
Exécution des commandes Bash
Comme vous l’avez peut-être déjà vu, le module subprocess est utilisé pour exécuter les commandes et les scripts bash. Il fournit différentes méthodes et classes pour cela.
Il y a principalement une méthode et une classe à connaître dans le module subprocess. Il s’agit de run et Popen. Ces deux méthodes nous aident à exécuter les commandes bash dans les scripts Python. Voyons-les un par un.
subprocess.run()
La méthode subprocess.run()
prend une liste de chaînes comme argument de position. Cette liste est obligatoire car elle contient la commande bash et ses arguments. Le premier élément de la liste est le nom de la commande et les autres éléments sont les arguments de la commande.
Voyons un exemple rapide.
import subprocess
subprocess.run(["ls"])
Le script ci-dessus dresse la liste de tous les éléments du répertoire de travail actuel au moment où le script s’exécute. Il n’y a pas d’arguments à la commande dans le script ci-dessus. Nous n’avons donné que la commande bash. Nous pouvons fournir des arguments supplémentaires à la commande ls
comme -l
, -a
, -la
, etc.
Voyons un exemple rapide avec des arguments de commande.
import subprocess
subprocess.run(["ls", "-la"])
La commande ci-dessus affiche tous les fichiers, y compris les fichiers cachés, ainsi que les permissions. Nous avons fourni l’argument la
qui affiche les informations supplémentaires sur les fichiers et les répertoires ainsi que les fichiers cachés.
Il se peut que nous fassions des erreurs en écrivant les commandes. Les erreurs s’affichent en fonction des fautes commises. Et si vous voulez les capturer et les utiliser plus tard ? Oui, nous pouvons le faire en utilisant le mot-clé argument stderr.
Voyons un exemple.
import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)
Assurez-vous que le fichier portant le nom sample.txt ne se trouve pas dans le répertoire de travail. La valeur du mot-clé stderr est PIPE , ce qui permet de renvoyer l’erreur dans un objet. Nous pourrons y accéder plus tard avec le même nom. Le mot-clé text permet d’indiquer que la sortie doit être une chaîne de caractères.
De même, nous pouvons capturer la sortie de la commande en utilisant le mot-clé argument stdout .
import subprocess
result = subprocess.run(["echo", "Hello, World !"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
subprocess.run() – entrée
Vous pouvez donner des informations aux commandes en utilisant le mot-clé input . Nous allons donner des entrées dans un format de chaîne de caractères. Nous devons donc attribuer la valeur True
au mot-clé text . Par défaut, le texte est pris en octets.
Voyons un exemple.
import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")
Dans le programme ci-dessus, le script Python add.py prend deux nombres en entrée. Nous avons donné l’entrée au script Python en utilisant l’argument du mot-clé input .
subprocess.Popen()
La classe subprocess.Popen() est plus avancée que la méthode subprocess.run(). Elle nous donne plus d’options pour exécuter les commandes. Nous allons créer une instance de la classe subprocess.Popen() et l’utiliser pour diverses choses comme connaître l’état de l’exécution de la commande, obtenir une sortie, donner une entrée, etc..,
Il existe plusieurs méthodes de la classe subprocess.Popen() que nous devons connaître. Nous allons les voir une par une, accompagnées d’exemples de code.
attendre
Elle permet d’attendre la fin de l’exécution de la commande. Les lignes suivantes du script Python ne s’exécuteront pas avant la fin de la commande précédente écrite après la méthode wait
. Voyons un exemple.
import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Terminé !")
Exécutez le code ci-dessus et observez la sortie. Vous verrez que le message Completed ! est imprimé avant l’exécution de la commande. Nous pouvons l’éviter en utilisant la méthode wait
. Attendons la fin de la commande.
import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()
print("Terminé !")
Si vous voyez la sortie du code ci-dessus, vous vous rendrez compte que wait
fonctionne. L’instruction print est exécutée après la fin de l’exécution de la commande.
communiquez
La méthode communicate
est utilisée pour obtenir la sortie, l’erreur et l’entrée de la commande. Elle renvoie un tuple contenant respectivement la sortie et l’erreur. Voyons un exemple.
import subprocess
process = subprocess.Popen(["echo", "Hello, World !"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
result = process.communicate()
print(result)
subprocess.Popen() – entrée
Nous ne pouvons pas transmettre directement l’entrée à la classe Popen
. Nous devons utiliser le mot-clé argument appelé stdin pour donner l’entrée à la commande. L’instance de la classe Popen
nous fournira l’objet stdin
. Il possède une méthode appelée write
qui est utilisée pour transmettre l’entrée à la commande.
Comme nous l’avons vu précédemment, les entrées sont prises par défaut sous la forme d’objets de type octets. N’oubliez donc pas de donner la valeur True
au mot-clé text lors de la création de l’instance de Popen
.
Voyons un exemple.
import subprocess
process = subprocess.Popen(["python3", "add.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
process.stdin.write("2 3")
process.stdin.close()
print(process.stdout.read())
sondage
La méthode poll
est utilisée pour vérifier si l’exécution de la commande est terminée ou non. Cette méthode renvoie None
si la commande est toujours en cours d’exécution. Voyons un exemple.
import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com/fr'], stdout=subprocess.PIPE, text=True)
while True :
output = process.stdout.readline()
if output :
print(output.strip())
result = process.poll()
si result n'est pas None :
break
Dans le code ci-dessus, nous avons utilisé la commande ping
avec 5 requêtes. Il y a une boucle infinie qui itère jusqu’à la fin de l’exécution de la commande. Nous avons utilisé la méthode poll
pour vérifier l’état de l’exécution de la commande. Si la méthode poll
renvoie un code autre que None
, l’exécution est terminée. La boucle infinie s’interrompt.
Exécution de scripts Bash
Nous avons vu deux façons d’exécuter les commandes. Voyons maintenant comment exécuter les scripts Bash dans les scripts Python.
Le sous-processus possède une méthode appelée call. Cette méthode est utilisée pour exécuter les scripts bash. La méthode renvoie le code de sortie du script bash. Le code de sortie par défaut des scripts bash est 0. Voyons un exemple.
Créez un script bash avec le nom practice.sh comme suit.
#!/bin/bash
echo "Hello, World !"
exit 1
Maintenant, écrivez un script Python qui exécute le script bash ci-dessus.
import subprocess
exit_code = subprocess.call('./practice.sh')
print(code_sortie)
Vous obtiendrez la sortie suivante lorsque vous exécuterez le script Python ci-dessus.
Bonjour, le monde !
1
Conclusion
Nous avons vu comment exécuter des commandes et des scripts bash en Python. Vous pouvez les utiliser pour automatiser les choses plus efficacement.
Bon codage 👨💻