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)
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
.
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)
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.
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"
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)
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
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])