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 10 s. (Je sais que c'est un exemple stupide, je pourrais simplement dormir dans python, mais ce simple fichier sleep.sh était juste comme un test)
Réponses:
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 devrez peut-être également ajouter./
un autre chemin approprié. (Ie, changez"sleep.sh"
pour"./sleep.sh"
.)Le
shell=True
paramètre n'est pas nécessaire (sous un système Posix comme Linux) si la première ligne du script bash est un chemin vers un shell; par exemple#!/bin/bash
,.la source
Si
sleep.sh
a le shebang#!/bin/sh
et qu'il a les autorisations de fichier appropriées - exécutezchmod u+rx sleep.sh
pour vous assurer qu'il est dedans,$PATH
alors votre code devrait fonctionner tel quel :Si le script n'est pas dans le PATH, spécifiez le chemin complet vers lui, par exemple, s'il se trouve dans le répertoire de travail actuel:
Si le script n'a pas de shebang, vous devez spécifier
shell=True
:Si le script n'a pas d'autorisations exécutables et que vous ne pouvez pas le modifier, par exemple, en exécutant,
os.chmod('sleep.sh', 0o755)
vous pouvez lire le script sous forme de fichier texte et passer la chaîne ausubprocess
module à la place:la source
En fait, il vous suffit d'ajouter l'
shell=True
argument:Mais méfiez-vous -
la source
la source
sleep.sh
n'est pas dans lePATH
. Et s'il est sur le chemin et qu'il a le bon shebang, vous n'en avez pas besoinshell=True
. Voir ma réponseSi quelqu'un cherche à appeler un script avec des arguments
N'oubliez pas de convertir les arguments en chaîne avant de passer, en utilisant str (arg).
Cela peut être utilisé pour passer autant d'arguments que vous le souhaitez:
la source
Assurez-vous qu'il
sleep.sh
dispose des autorisations d'exécution et exécutez-le avecshell=True
:la source
#!bin/bash
est un manquant/
.#!/bin/bash
fonctionne comme je le note dans une réponse.Si chmod ne fonctionne pas, vous essayez également
tester par moi merci
la source
os.system
documentation recommande spécifiquement de l'éviter en faveur desubprocess
(ces jours-ci,subprocess.run()
). Si vous ne pouvez pas vous rendresubprocess
au travail, il y a de fortes chances que vous ayez aussi des problèmesos.system()
.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 veille:subprocess.call("sleep.sh 10")
ne fonctionnera pas, vous devez le passer sous forme de tableau:subprocess.call(["sleep.sh", 10])
la source
shell=True
mais oui, généralement l'éviter est votre meilleur jeu.