Comment exécuter des scripts bash à l'aide de Python ?
Si vous utilisez Linux, vous adorerez certainement les commandes shell.
Et si vous travaillez avec Python, vous avez peut-être essayé d'automatiserate des choses. C'est une façon de gagner du temps. Vous pouvez également avoir des scripts bash pour automatiserate des choses.
Python est pratique pour écrire des scripts plutôt que bash. Et la gestion des scripts Python est simple par rapport aux scripts bash. Vous aurez du mal à maintenir les scripts bash une fois qu'ils seront growING.
Mais que se passe-t-il si vous avez déjà des scripts bash que vous souhaitez exécuter en utilisant Python ?
Existe-t-il un moyen d'exécuter les commandes et les scripts bash en Python ?
Oui, Python a un module intégré appelé dessousprocess 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 dessousprocess est utilisé pour exécuter les commandes et les scripts bash. Il fournit différentes méthodes et classes pour les mêmes.
Il y a principalement une méthode et une classe à connaître de la dessousprocess module. Elles sont courir et de Ouvrir. Ces deux nous aident à exécuter les commandes bash dans les scripts Python. Voyons-les un par un.
dessousprocess.Cours()
Procédé subprocess.run()
prendra une liste de chaînes comme argument de position. C'est obligatoire car il a la commande bash et les arguments pour cela. Le premier élément de la liste est le nom de la commande et les éléments restants sont les arguments de la commande.
Voyons un exemple rapide.
import subprocess
subprocess.run(["ls"])
Le script ci-dessus répertorie tous les éléments du répertoire de travail actuel comme le script se trouve. Il n'y a pas d'arguments pour la commande dans le script ci-dessus. Nous n'avons donné que la commande bash. Nous pouvons fournir des arguments supplémentaires à la ls
commande 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 autorisations. Nous avons fourni l'argument la
qui affiche les fichiers et les répertoires extra informations et fichiers cachés.
Nous pouvons finir par faire des erreurs lors de l’écriture des commandes. Les erreurs augmenteront en fonction des erreurs. Et si vous souhaitez les capturer et les utiliser later? Ouais, nous pouvons le faire en utilisant l'argument mot-clé stderr.
Voyons un exemple.
import subprocess
result = subprocess.run(["cat", "sample.txt"], stderr=subprocess.PIPE, text=True)
print(result.stderr)
Assurez-vous que vous n'avez pas le fichier avec le nom exemple.txt dans le répertoire de travail. La valeur de l'argument mot-clé stderr is TUYAU ce qui aide à renvoyer l'erreur dans un objet. Nous pouvons y accéder later avec le même nom. Et l'argument mot-clé texte aide à dire que la sortie doit être une chaîne.
De même, nous pouvons capturer la sortie de la commande en utilisant le Stdout argument de mot-clé.
import subprocess
result = subprocess.run(["echo", "Hello, World!"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
dessousprocess.run() – entrée
Vous pouvez saisir les commandes en utilisant le contribution argument de mot-clé. Nous allons donner des entrées dans un format de chaîne. Donc, nous devons définir l'argument mot-clé texte à True
. Par défaut, il le prend en octets.
Regardons un exemple.
import subprocess
subprocess.run(["python3", "add.py"], text=True, input="2 3")
Dans le programme ci-dessus, le script Python ajouter.py prendra deux nombres en entrée. Nous avons donné l'entrée au script Python en utilisant le contribution argument de mot-clé.
dessousprocess.Popen()
La classe dessousprocess.Popen() est plus avancé que la méthode dessousprocess.Cours(). Cela nous donne plus d'options pour exécuter les commandes. Nous allons créerate un exemple de dessousprocess.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 dessousprocess.Popen() que nous devons savoir. Voyons-les un par un avec les exemples de code.
attendez
Il 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 du prevcommande ious qui est écrite après le wait
méthode. Voyons l'exemple.
import subprocess
process = subprocess.Popen(["ls", "-la"])
print("Completed!")
Exécutez le code ci-dessus et observez la sortie. Vous verrez que le message Terminé! est imprimé avant l'exécution de la commande. Nous pouvons l'éviter en utilisant le wait
méthode. Attendons la fin de la commande.
import subprocess
process = subprocess.Popen(["ls", "-la"])
process.wait()
print("Completed!")
Si vous voyez la sortie du code ci-dessus, vous vous rendrez compte que wait
est réelally fonctionnement. L'impression statement est exécuté après la fin de l’exécution de la commande.
communicate
Procédé communicate
est utilisé pour obtenir la sortie, l'erreur et donner une entrée à la commande. Il 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)
dessousprocess.Popen() – entrée
Nous ne pouvons pas transmettre l'entrée à la classe Popen
directement. Nous devons utiliser l'argument mot-clé appelé Stdin pour donner l'entrée à la commande. L'instance de la classe Popen
nous fournira stdin
objet. Il a une méthode appelée write
qui est utilisé pour donner l'entrée à la commande.
Comme nous l'avons vu précédemment, les entrées seront par défaut des objets de type octet. Donc, n'oubliez pas de définir l'argument mot-clé texte à True
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())
po
Procédé poll
permet de vérifier si l'exécution de la commande est terminée ou non. Cette méthode retournera None
si la commande est toujours en cours d'exécution. Voyons un exemple.
import subprocess
process = subprocess.Popen(['ping', '-c 5', 'geekflare.com'], stdout=subprocess.PIPE, text=True)
while True:
output = process.stdout.readline()
if output:
print(output.strip())
result = process.poll()
if result is not None:
break
Dans le code ci-dessus, nous avons utilisé le ping
commande avec 5 requêtes. Il y a une boucle infinie qui itèreates 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
, puis l'exécution se termine. Et la boucle infinie se brise.
Exécution de scripts Bash
Nous avons vu deux manières d'exécuter les commandes. Voyons maintenant comment exécuter les scripts bash dans les scripts Python.
Le dessousprocess a une méthode appelée Appelez-nous. 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 pour les scripts bash est 0. Voyons un exemple.
Create un script bash avec le nom practice.sh comme suit.
#!/bin/bash
echo "Hello, World!"
exit 1
Maintenant, écrivez un script Python, exécutez le script bash ci-dessus.
import subprocess
exit_code = subprocess.call('./practice.sh')
print(exit_code)
Vous obtiendrez la sortie suivante une fois que vous aurez exécuté le script Python ci-dessus.
Hello, World!
1
Conclusion
Nous avons vu comment exécuter des commandes et des scripts bash en Python. Vous pouvez les utiliser pour automatiserate les choses plus efficacement.
Codage heureux 👨💻