Python >> Tutoriel Python >  >> Python

Comment appeler une commande externe en Python ?

Résumé : Pour appeler une commande externe dans un script Python, utilisez l'une des méthodes suivantes :

  • subprocess.call() fonction
  • subprocess.run() fonction
  • subprocess.Popen Classe
  • os.system() fonction
  • os.popen() fonction

Que vous soyez développeur ou administrateur système, les scripts d'automatisation feront partie intégrante de votre routine quotidienne.

Il peut s'agir d'automatiser des tâches de routine telles que des sauvegardes de fichiers ou des vérifications de l'état. Cependant, la maintenance de tels scripts shell peut devenir fastidieuse et complexe. C'est là que les scripts Python sont utiles et ouvrent une toute nouvelle dimension pour gérer facilement de telles tâches. Mais pour que de tels scripts fonctionnent efficacement, nous devons apprendre à invoquer des commandes externes/shell dans nos scripts Python. Cela dit, passons à notre énoncé du problème.


Problème : Étant donné une commande externe pouvant s'exécuter sur votre système d'exploitation ; comment appeler la commande en utilisant un script Python ?

Exemple  :Supposons que vous souhaitiez envoyer un ping à un serveur distant à l'aide du ping de votre système d'exploitation. commande, le tout depuis votre programme Python.

Python propose différentes manières d'appeler et d'exécuter des commandes shell externes. Sans plus tarder, discutons des différentes méthodes qui peuvent être utilisées pour invoquer des commandes externes en Python et des scénarios idéaux pour les utiliser.

Méthode 1 :Utilisation de la fonction subprocess.call()

Le subprocess module est la méthode recommandée pour invoquer et exécuter des commandes externes en Python. Il fournit un moyen flexible de supprimer l'entrée et la sortie de diverses commandes externes/shell et, une fois invoqué, il déclenche de nouveaux processus et obtient ensuite leurs codes de retour.

Vous pouvez utiliser diverses fonctions avec le module subprocess pour invoquer des commandes externes à l'aide d'un script Python.

Le call() La fonction du module de sous-processus est utilisée pour démarrer un processus externe, attend que la commande se termine, puis fournit un code de retour. Ainsi le subprocess.call() La fonction est utilisée pour renvoyer un code de sortie qui peut ensuite être utilisé dans le script pour déterminer si la commande s'est exécutée avec succès ou si elle a renvoyé une erreur. Tout code de retour autre que "0" signifie qu'il y a eu une erreur d'exécution.

Regardons le programme suivant utilisant le call() fonction pour vérifier si le test ping est réussi dans le système :

import subprocess

return_code = subprocess.call(['ping', 'localhost'])
print("Output of call() : ", return_code)

Sortie :

Pinging DESKTOP-PC [::1] with 32 bytes of data:
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 

Ping statistics for::1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Output of call() :  0

Méthode 2 :Utilisation de la fonction subprocess.run()

Dans Python 3.5 et supérieur, le run() function est la méthode recommandée pour invoquer le subprocess module pour exécuter une commande externe.

Il est similaire au call() fonction, cependant, contrairement au call() fonction, il ne renvoie pas d'exception si le processus sous-jacent renvoie un code d'erreur. Le run() fonction est plus flexible que le call() fonction et au lieu de renvoyer un code de retour, elle renvoie un CompletedProcess objet une fois que le code a terminé son exécution.

import subprocess

return_code = subprocess.run(['ping', 'localhost'])
print("Output of run() : ", return_code)

Sortie :

Pinging DESKTOP-PC [::1] with 32 bytes of data:
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 
Reply from ::1: time<1ms 

Ping statistics for::1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Output of run() :  CompletedProcess(args=['ping', 'localhost'], returncode=0)

Méthode 3 :Utilisation de la classe subprocess.Popen

L'utilisation de subprocess.Popen() est recommandé uniquement pour les cas avancés qui ne peuvent pas être traités par d'autres méthodes comme subprocess.run() ou subprocess.call() . En effet, du fait de son caractère global, il est plus compliqué et difficile à gérer. Néanmoins, il peut s'avérer déterminant dans le traitement d'opérations complexes.

Examinons le code suivant qui utilise le Popen() pour ouvrir Microsoft Excel sous Windows :

import subprocess

subprocess.Popen("C:\Program Files (x86)\Microsoft Office\Office12\excel.exe")

Méthode 4 :Utilisation de la fonction os.system(command)

Le os module en Python fournit plusieurs fonctions pour interagir directement avec le shell et le système. Jetons un coup d'œil à quelques méthodes pour invoquer des commandes externes en utilisant le os module.

Le os.system() La fonction aide à interagir immédiatement avec le shell en transmettant des commandes et des arguments au shell système. Il renvoie un code de sortie à la fin de la commande, ce qui signifie qu'un code de sortie de 0 indique une exécution réussie tandis que tout autre que 0 signifie que l'exécution a échoué. D'une part, c'est une approche pratique puisque le system() la méthode peut être utilisée pour exécuter plusieurs commandes à la fois à l'aide de canaux et de la redirection d'entrée/sortie ; tandis que d'autre part, vous devez gérer manuellement les caractères d'échappement tels que les espaces.

Regardons le programme suivant qui est utilisé pour afficher la date actuelle du système en utilisant le os.system() commande :

import os

dt = 'date'
os.system(dt)

Sortie :

The current date is: 03-09-2020 

Vous pouvez l'essayer vous-même dans notre shell interactif en ligne :

Exercice :Exécutez le code. Pourquoi la sortie est-elle différente de la sortie sur votre propre machine ?

Méthode 5 :Utilisation de la fonction os.popen ("Commande")

Le os.popen() se comportera comme os.system Toutefois, au lieu de renvoyer le code de retour, elle renvoie un objet semblable à un fichier qui peut être utilisé pour accéder à l'entrée/sortie standard du processus en cours d'exécution. Le popen La commande nous permet d'interagir avec le système et de créer un canal vers ou depuis une autre commande. Il a quatre variantes différentes qui sont :

  • ouvrir
  • popen2
  • popen3
  • popen4

Regardons le programme suivant qui utilise popen pour imprimer une chaîne en sortie en appelant la commande shell, echo :

import os

print (os.popen("echo Hello FINXTER!").read())

Sortie :

Hello FINXTER!

Essayez vous-même :

Exercice :Est-ce que la commande echo doit être installée sur le serveur pour que cela fonctionne ?

Quelle méthode devez-vous utiliser ?

  • os.system()  :Si l'impression de la sortie sur la console n'est pas un critère et que vous n'avez besoin d'exécuter que quelques commandes simples, vous pouvez utiliser le os.system() fonction.
  • subprocess.run() :Si vous voulez gérer l'entrée et la sortie d'une commande externe alors utilisez le subprocess.run() commande.
  • subprocess.Popen  :Si vous souhaitez gérer une commande externe complexe et continuer votre travail, vous pouvez utiliser le subprocess.Popen classe.

Conclusion

Ainsi, de la discussion ci-dessus, nous pouvons conclure que les méthodes suivantes peuvent être utilisées pour appeler une commande externe en python :

  1. subprocess.call() fonction
  2. subprocess.run() fonction
  3. subprocess.Popen Classe
  4. os.system() fonction
  5. os.popen() fonction

La documentation officielle de Python recommande d'utiliser le subprocess module sur le os le module fonctionne depuis le subprocess module offre plusieurs avantages par rapport au os module comme des options plus flexibles, une meilleure gestion des erreurs et bien plus encore.

J'espère que vous avez trouvé cet article utile et qu'il vous aide à comprendre comment invoquer des commandes externes en python. Restez à l'écoute pour des concepts plus intéressants à l'avenir.