Comment exécuter des commandes Shell en Python à l'aide de la méthode d'exécution de sous-processus

How Execute Shell Commands Python Using Subprocess Run Method



Subprocess est un module Python intégré qui peut être utilisé pour créer de nouveaux processus et interagir avec leurs flux de données d'entrée et de sortie. En termes plus simples, vous pouvez l'utiliser pour exécuter des commandes shell et exécuter des fichiers binaires exécutables généralement dispersés dans divers dossiers bin sur un système de fichiers Linux. Vous pouvez également fournir un chemin complet vers un binaire exécutable et utiliser n'importe quel commutateur de ligne de commande associé au binaire. Cet article explique comment utiliser le module de sous-processus et sa méthode d'exécution dans les applications Python. Tous les exemples de code de l'article sont testés avec Python 3.8.2 sur Ubuntu 20.04.

La méthode Subprocess.run

La méthode Subprocess.run prend une liste d'arguments. Lorsque la méthode est appelée, elle exécute la commande et attend la fin du processus, renvoyant à la fin un objet CompletedProcess. L'objet CompletedProcess renvoie stdout, stderr, les arguments d'origine utilisés lors de l'appel de la méthode et un code de retour. Stdout fait référence au flux de données produit par la commande, tandis que stderr fait référence à toutes les erreurs générées lors de l'exécution du programme. Tout code de retour différent de zéro (code de sortie) signifierait une erreur avec la commande exécutée dans la méthode subprocess.run.







Exemple 1 : Contenu de sortie d'un fichier texte à l'aide de la méthode Subprocess.run

La commande ci-dessous affichera le contenu d'un fichier data.txt, en supposant qu'il contienne une chaîne name=John.



importer sous-processus
sous-processus.Cours(['chat', 'données.txt'])

L'exécution du code ci-dessus renverra la sortie suivante :



Nom=John
Processus terminé(arguments=['chat', 'données.txt'],Code de retour=0)

Le premier élément de l'argument list est le nom de la commande à exécuter. Tout élément de la liste qui suit le premier élément est considéré comme une option ou un commutateur de ligne de commande. Vous pouvez également utiliser des tirets simples et doubles pour définir les options. Par exemple, pour répertorier les fichiers et dossiers dans un répertoire, le code serait subprocess.run([ls, -l]. Dans la plupart de ces cas, vous pouvez considérer n'importe quel argument séparé par des espaces dans une commande shell comme un élément individuel dans la liste fournie à la méthode subprocess.run.





Exemple 2 : Supprimer la sortie de la méthode Subprocess.run

Pour supprimer la sortie de la méthode subprocess.run, vous devrez fournir stdout=subprocess.DEVNULL et stderr=subprocess.DEVNULL comme arguments supplémentaires.

importer sous-processus

sous-processus.Cours(['chat', 'données.txt'],sortie standard=sous-processus.DEVNULL,
stderr=sous-processus.DEVNULL)

L'exécution du code ci-dessus produira la sortie suivante :



CompletedProcess(args=['cat', 'data.txt'], returncode=0)

Exemple 3 : Capturer la sortie de la méthode Subprocess.run

Pour capturer la sortie de la méthode subprocess.run, utilisez un argument supplémentaire nommé capture_output=True.

importer sous-processus
sortir= sous-processus.Cours(['chat', 'données.txt'],capture_sortie=Vrai)
imprimer (sortir)

L'exécution du code ci-dessus produira la sortie suivante :

Processus terminé(arguments=['chat', 'données.txt'],Code de retour=0,
sortie standard=b'nom=Jean ',stderr=b'')

Vous pouvez accéder individuellement aux valeurs stdout et stderr en utilisant les méthodes output.stdout et output.stderr. La sortie est produite sous la forme d'une séquence d'octets. Pour obtenir une chaîne en sortie, utilisez la méthode output.stdout.decode(utf-8). Vous pouvez également fournir text=True comme argument supplémentaire à l'appel subprocess.run pour obtenir la sortie au format chaîne. Pour obtenir le code d'état de sortie, vous pouvez utiliser la méthode output.returncode.

Exemple 4 : déclencher une exception en cas d'échec de la commande exécutée par la méthode Subprocess.run

Pour lever une exception lorsque la commande se termine avec un état différent de zéro, utilisez l'argument check=True.

importer sous-processus
sous-processus.Cours(['chat', 'data.tx'],capture_sortie=Vrai,texte=Vrai,Chèque=Vrai)

L'exécution du code ci-dessus produira la sortie suivante :

augmenter CalledProcessError(retcode, process.args,
subprocess.CalledProcessError : commande '['cat', 'data.tx']'
a renvoyé un état de sortie différent de zéro 1.

Exemple 5 : passer une chaîne à la commande exécutée par la méthode Subprocess.run

Vous pouvez passer une chaîne à la commande à exécuter par la méthode subprocess.run en utilisant l'argument input='string'.

importer sous-processus
sortir= sous-processus.Cours(['chat'], saisir='données.txt',capture_sortie=Vrai,
texte=Vrai,Chèque=Vrai)
imprimer (sortir)

L'exécution du code ci-dessus produira la sortie suivante :

CompletedProcess(args=['cat'], returncode=0, stdout='data.txt', stderr='')

Comme vous pouvez le voir, le code ci-dessus transmet data.txt en tant que chaîne et non en tant qu'objet fichier. Pour transmettre data.txt en tant que fichier, utilisez l'argument stdin.

avec ouvert('données.txt') commeF:
sortir= sous-processus.Cours(['chat'],standard=F,capture_sortie=Vrai,
texte=Vrai,Chèque=Vrai)
imprimer (sortir)

L'exécution du code ci-dessus produira la sortie suivante :

CompletedProcess(args=['cat'], returncode=0, stdout='name=John ', stderr='')

Exemple 6 : Exécuter la commande directement dans le shell à l'aide de la méthode Subprocess.run

Il est possible d'exécuter une commande directement dans un shell telle quelle, au lieu d'utiliser une séparation de chaîne dans la commande principale et les options qui la suivent. Pour ce faire, vous devez passer shell=True comme argument supplémentaire. Ceci est cependant déconseillé par les développeurs python car l'utilisation de shell=True peut entraîner des problèmes de sécurité. Vous pouvez en savoir plus sur les implications de sécurité à partir de ici .

importer sous-processus
sous-processus.Cours('cat 'data.txt'',coquille=Vrai)

L'exécution du code ci-dessus produira la sortie suivante :

nom=Jean

Conclusion

La méthode subprocess.run en Python est assez puissante, car elle vous permet d'exécuter des commandes shell dans python lui-même. Cela permet de limiter tout le code à python lui-même sans avoir besoin d'avoir du code de script shell supplémentaire dans des fichiers séparés. Cependant, il peut être assez difficile de tokeniser correctement les commandes shell dans une liste python. Vous pouvez utiliser la méthode shlex.split() pour tokeniser des commandes shell simples, mais dans les commandes longues et complexes – en particulier celles avec des symboles de tuyau – shlex ne parvient pas à scinder correctement la commande. Dans de tels cas, le débogage peut être un problème délicat. Vous pouvez utiliser l'argument shell=True pour éviter cela, mais certains problèmes de sécurité sont associés à cette action.