• Assurez la sécurité des applications de la bonne manière! Détectez, protégez, surveillez, accélérez et plus encore…
  • Si vous utilisez Linux, vous adorerez certainement les commandes shell.

    Et si vous travaillez avec Python, vous avez peut-être essayé d'automatiser les choses. C'est une façon de gagner du temps. Vous pouvez également avoir des scripts bash pour automatiser les choses.

    Python est plus pratique pour écrire des scripts que bash. Et la gestion des scripts Python est facile par rapport aux scripts bash. Vous aurez du mal à maintenir les scripts bash une fois qu'ils se développeront.

    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é sous-processus 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.

    Executing Bash Commands

    Comme vous l'avez peut-être déjà vu le module sous-processus 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 sous-processus module. Elles sont courir et Popen. Ces deux nous aident à exécuter les commandes bash dans les scripts Python. Voyons-les un par un.

    sous-processus.run()

    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 des informations supplémentaires sur les fichiers et les répertoires et les 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 vouliez les capturer et les utiliser plus tard ? Oui, 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 qui aide à renvoyer l'erreur dans un objet. Nous pourrons y accéder plus tard 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)
    

    subprocess.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é.

    sous-processus.Popen()

    La classe sous-processus.Popen() est plus avancé que la méthode sous-processus.run(). Cela nous donne plus d'options pour exécuter les commandes. Nous allons créer une instance du sous-processus.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 sous-processus.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 de la commande précédente é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 fonctionne réellement. L'instruction print est exécutée après la fin de l'exécution de la commande.

    communiquer

    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)

    subprocess.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 existe 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, puis l'exécution se termine. Et la boucle infinie se brise.

    Executing Bash Scripts

    Nous avons vu deux manières d'exécuter les commandes. Voyons maintenant comment exécuter les scripts bash dans les scripts Python.

    Le sous-processus 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.

    Créez 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 automatiser les choses plus efficacement.

    Codage heureux 👨‍💻