Comment exécuter les commandes shell dans Python en utilisant la méthode d'exécution de sous-processus

Comment exécuter les commandes shell dans Python en utilisant la méthode d'exécution de sous-processus
Le sous-processus 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 de shell et exécuter des binaires exécutables généralement dispersés dans divers dossiers «bac» sur un système de fichiers Linux. Vous pouvez également fournir un chemin complet vers un binaire exécutable et utiliser tous les commutateurs de ligne de commande associés au binaire. Cet article expliquera comment utiliser le module de sous-processus et sa méthode d'exécution dans les applications Python. Tous les échantillons de code de l'article sont testés avec Python 3.8.2 sur Ubuntu 20.04.

Le sous-processus.méthode d'exécution

Le sous-processus.La méthode d'exécution prend une liste d'arguments. Lorsque la méthode est appelée, il exécute la commande et attend que le processus se termine, renvoyant un objet «terminé» à la fin. L'objet «ComplétedProcess» renvoie Stdout, Stderr, arguments originaux 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 soulevées lors de l'exécution du programme. Tout code de retour non nul (code de sortie) signifierait une erreur avec la commande exécutée dans le sous-processus.méthode d'exécution.

Exemple 1: contenu de sortie d'un fichier texte à l'aide du sous-processus.méthode d'exécution

La commande ci-dessous sortira le contenu d'une «données.Fichier txt ”, en supposant qu'il contient une chaîne« name = John ».

sous-processus d'importation
sous-processus.Exécuter (["Cat", "données.SMS"])

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

nom = John
Production terminée (args = [«cat», «données.txt '], returncode = 0)

Le premier élément de l'argument de la liste est le nom de la commande à exécuter. Tout élément de la liste qui suit le premier élément est considéré comme des options de ligne de commande ou des commutateurs. Vous pouvez également utiliser un tableau de bord unique et des tirets doubles pour définir les options. Par exemple, pour répertorier les fichiers et les dossiers dans un répertoire, le code serait «Sous-processus.Run (["ls", "-l"] ". Dans la plupart de ces cas, vous pouvez considérer tout argument séparé de l'espace dans une commande shell en tant qu'élément individuel de la liste fournie au sous-processus.méthode d'exécution.

Exemple 2: supprimer la sortie du sous-processus.méthode d'exécution

Pour supprimer la sortie du sous-processus.Méthode d'exécution, vous devrez fournir «stdout = sub-processus.Devnull »et« stderr = sub-processus.Devnull "comme arguments supplémentaires.

sous-processus d'importation
sous-processus.Exécuter (["Cat", "données.txt "], stdout = sous-processus.Dévoiler,
stderr = sous-processus.Devnull)

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

Production terminée (args = [«cat», «données.txt '], returncode = 0)

Exemple 3: Capture la sortie de la sous-processus.méthode d'exécution

Pour capturer la sortie du sous-processus.Méthode d'exécution, utilisez un argument supplémentaire nommé «capture_output = true».

sous-processus d'importation
sortie = sous-processus.Exécuter (["Cat", "données.txt "], capture_output = true)
Imprimer (sortie)

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

Production terminée (args = [«cat», «données.txt '], returncode = 0,
stdout = b'name = John \ n ', stderr = b ")

Vous pouvez accéder individuellement à STDOUT et aux valeurs stderr en utilisant «la sortie.stdout »et« sortie.Méthodes Stderr ». La sortie est produite comme une séquence d'octets. Pour obtenir une chaîne comme sortie, utilisez la «sortie.stdout.MÉTHODE DECODE ("UTF-8") ". Vous pouvez également fournir «Text = True» comme un argument supplémentaire au sous-processus.Exécutez l'appel pour obtenir la sortie au format de chaîne. Pour obtenir le code d'état de sortie, vous pouvez utiliser la «sortie.Méthode de returncode ».

Exemple 4: soulever une exception sur l'échec de la commande exécutée par le sous-processus.méthode d'exécution

Pour lever une exception lorsque la commande sort avec un statut non nul, utilisez l'argument «Check = true».

sous-processus d'importation
sous-processus.Exécuter (["Cat", "données.tx "], capture_output = true, text = true, check = true)

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

River appeléProcessError (retcode, processus.args,
sous-processus.AppeléProcessError: commande '[' cat ',' data.tx ']'
Statut de sortie non nul retourné 1.

Exemple 5: Passez une chaîne à la commande exécutée par le sous-processus.méthode d'exécution

Vous pouvez transmettre une chaîne à la commande à exécuter par sub-processus.Exécutez la méthode à l'aide de l'argument «Input = 'String» ».

sous-processus d'importation
sortie = sous-processus.Exécuter (["Cat"], Input = "Data.txt ", capture_output = true,
text = true, check = true)
Imprimer (sortie)

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

Terminé Process (args = ['cat'], returncode = 0, stdout = 'data.txt ', stderr = ")

Comme vous pouvez le voir, le code ci-dessus passe «Données.txt ”comme chaîne et non comme un objet de fichier. Pour passer les «données.txt "comme fichier, utilisez l'argument" stdin ".

avec ouvert ("Données.txt ") comme f:
sortie = sous-processus.run (["cat"], stdin = f, capture_output = true,
text = true, check = true)
Imprimer (sortie)

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

TerminéProcess (args = ['cat'], returncode = 0, stdout = 'name = John \ n', stderr = ")

Exemple 6: Exécutez la commande directement dans Shell à l'aide du sous-processus.méthode d'exécution

Il est possible d'exécuter une commande directement dans un shell «tel quel», au lieu d'utiliser une chaîne divisée dans la commande principale et les options qui le suivent. Pour ce faire, vous devez passer «shell = true» comme argument supplémentaire. Ceci est cependant découragé par les développeurs de 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 d'ici.

sous-processus d'importation
sous-processus.Exécuter (Données "Cat".txt '", shell = true)

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

nom = John

Conclusion

Le sous-processus.La méthode d'exécution dans Python est assez puissante, car elle vous permet d'exécuter des commandes de shell dans Python lui-même. Cela aide à 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. Il peut cependant être tout à fait difficile de tokensiner correctement les commandes de shell dans une liste de python. Vous pouvez utiliser le «Shlex.Méthode Split () ”pour tokensiner des commandes de shell simples, mais dans des commandes longues et complexes - en particulier celles avec des symboles de tuyaux - Shlex ne parvient pas à diviser correctement la commande. Dans de tels cas, le débogage peut être une question délicate. Vous pouvez utiliser l'argument «shell = true» pour éviter cela, mais il y a certaines problèmes de sécurité associés à cette action.