web-dev-qa-db-fra.com

Exécution du script bash depuis python

J'ai un problème avec le code suivant:

callBash.py:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

sleep.sh:

sleep 10

Je veux que la "fin" soit imprimée après 10s. (Je sais que ceci est un exemple stupide, je pourrais simplement dormir dans Python, mais ce simple fichier sleep.sh était juste comme un test)

81
user1638145

Rendre sleep.sh exécutable et ajouter Shell=True à la liste des paramètres (comme suggéré dans les réponses précédentes) fonctionne correctement. Selon le chemin de recherche, vous devrez peut-être aussi ajouter ./ ou un autre chemin approprié. (Par exemple, changez "sleep.sh" en "./sleep.sh".)

Le paramètre Shell=True n'est pas nécessaire (sous un système Posix tel que Linux) si la première ligne du script bash est un chemin d'accès à un shell; par exemple, #!/bin/bash.

72

Si sleep.sh a le Shebang #!/bin/sh et qu'il dispose des autorisations de fichier appropriées - exécutez chmod u+rx sleep.sh pour vous en assurer et s'il est dans $PATH, votre code devrait alors fonctionner tel quel:

import subprocess

rc = subprocess.call("sleep.sh")

Si le script ne se trouve pas dans le PATH, spécifiez son chemin complet, par exemple s'il se trouve dans le répertoire de travail en cours:

from subprocess import call

rc = call("./sleep.sh")

Si le script n'a pas de Shebang, vous devez spécifier Shell=True:

rc = call("./sleep.sh", Shell=True)

Si le script ne dispose d'aucune autorisation exécutable et que vous ne pouvez pas le modifier, par exemple, en exécutant os.chmod('sleep.sh', 0o755), vous pouvez le lire en tant que fichier texte et transmettre la chaîne au module subprocess à la place:

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, Shell=True)
29
jfs

En fait, il vous suffit d'ajouter l'argument Shell=True:

subprocess.call("sleep.sh", Shell=True)

Mais méfiez-vous -

Avertissement Invoquer le système Shell avec Shell = True peut constituer un risque pour la sécurité si elle est combinée avec une entrée non fiable. Voir l'avertissement sous Arguments fréquemment utilisés pour plus de détails.

source

29
zenpoy

Assurez-vous que sleep.sh dispose des autorisations d'exécution et exécutez-le avec Shell=True:

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", Shell=True)
print "end"
8
Adam Matan

Si quelqu'un cherche appelle un script avec des arguments

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg,   Shell=True)

n'oubliez pas de convertir les arguments en chaîne avant de passer, en utilisant str (arg).

Ceci peut être utilisé pour passer autant d'arguments que nécessaire

subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3),   Shell=True)
8
Ponmudi VN

Si chmod ne fonctionne pas, essayez également

import os
os.system('sh script.sh')
#you can also use bash instead of sh

test par moi merci

6
Harry1992

Ajout d’une réponse car j’ai été dirigé ici après avoir demandé comment exécuter un script bash à partir de python. Vous recevez une erreur OSError: [Errno 2] file not found si votre script prend des paramètres. Disons par exemple que votre script a pris un paramètre de temps de sommeil: subprocess.call("sleep.sh 10") ne fonctionnera pas, vous devez le transmettre sous forme de tableau: subprocess.call(["sleep.sh", 10])

2
Matthew Lang