167 votes

Exécution de bash script à partir de 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 c'est un exemple stupide, je pourrais simplement dormir dans python, mais ce simple fichier sleep.sh était juste un test).

124voto

jwpat7 Points 5502

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 bien. En fonction du chemin de recherche, vous pouvez également avoir besoin d'ajouter ./ ou tout autre chemin approprié. (Par exemple, changez "sleep.sh" a "./sleep.sh" .)

El shell=True n'est pas nécessaire (sous un système Posix comme Linux) si la première ligne du bash script est un chemin vers un shell ; par exemple, #!/bin/bash .

78voto

J.F. Sebastian Points 102961

Si sleep.sh a tout le toutim #!/bin/sh et qu'il a les droits d'accès aux fichiers appropriés. chmod u+rx sleep.sh pour être sûr et c'est dans $PATH alors votre code devrait fonctionner tel quel :

import subprocess

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

Si le script n'est pas dans le PATH alors spécifiez le chemin complet vers lui, par exemple, s'il est dans le répertoire de travail actuel :

from subprocess import call

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

Si le script n'a pas de shebang alors vous devez spécifier shell=True :

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

Si le script n'a pas de permissions d'exécution et que vous ne pouvez pas le changer, par exemple en exécutant os.chmod('sleep.sh', 0o755) alors vous pourriez lire le script comme un fichier texte et passer la chaîne à subprocess à la place :

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

48voto

VNP Points 41

Si quelqu'un cherche appeler 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 de caractères avant de les transmettre, en utilisant str(arg).

Ceci peut être utilisé pour passer autant d'arguments que souhaité :

subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)

37voto

zenpoy Points 6175

En fait, il suffit d'ajouter le shell=True argument :

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

Mais attention -

Avertissement L'invocation de l'interpréteur de commandes du système avec shell=True peut constituer un risque pour la sécurité si elle est combinée à une entrée non fiable. Voir l'avertissement sous Arguments fréquemment utilisés pour plus de détails.

fuente

16voto

Adam Matan Points 15690

Assurez-vous que sleep.sh a les droits d'exécution, et l'exécuter avec shell=True :

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X