web-dev-qa-db-fra.com

Comment exécuter des commandes bash dans un script Python

J'essaie d'exécuter les commandes Python et bash dans un script bash . Dans le script bash, je souhaite exécuter certaines commandes bash entourées d'une boucle Python:

#!/bin/bash

python << END
for i in range(1000):
    #execute‬ some bash command such as echoing i
END

Comment puis-je faire ceci?

22
Md. Zakir Hossan

Utilisez sous-processus , par exemple:

import subprocess
# ...

subprocess.call(["echo", i])

Il existe une autre fonction comme subprocess.call: subprocess.check_call. C'est exactement comme appel, mais il lève une exception si la commande exécutée est retournée avec un code de sortie différent de zéro. Ce comportement est souvent faisable dans les scripts et les utilitaires.

subprocess.check_output se comporte de la même façon que check_call, mais renvoie la sortie standard du programme.


Si vous n'avez pas besoin des fonctionnalités de Shell (telles que l'expansion des variables, les caractères génériques, ...), n'utilisez jamais Shell = True (Shell = False est la valeur par défaut). Si vous utilisez Shell = True, Shell vous permet d'échapper à ces fonctions. Elles constituent un trou de sécurité si elles sont transmises à une entrée utilisateur non validée.

La même chose est vraie de os.system () - c’est une source fréquente de problèmes de sécurité. Ne l'utilisez pas.

38
dom0

Regardez dans le sous-processus module. Il existe la méthode Popen et certaines fonctions d'encapsulation telles que call.

  • Si vous devez vérifier la sortie (récupérer la chaîne de résultat):

    output = subprocess.check_output(args ....)
    
  • Si vous voulez attendre la fin de l'exécution avant de continuer:

    exitcode = subprocess.call(args ....)
    
  • Si vous avez besoin de fonctionnalités supplémentaires telles que la définition de variables d'environnement, utilisez le constructeur Popen sous-jacent:

    subprocess.Popen(args ...)
    

Rappelez-vous que le sous-processus est le module de niveau supérieur. Il devrait remplacer les fonctions héritées du module OS.

17
user3058846

Je l'ai utilisé en exécutant depuis mon IDE (PyCharm).

import subprocess

subprocess.check_call('mybashcommand', Shell=True)
0
Ger Mc