J'ai écrit un script Python qui exécute des scripts bash comme celui-ci:
cmd = subprocess.Popen(['bash', 'script.sh'])
De cette façon, il exécute le script bien que je n’ai pas défini d’autorisations d’exécution avec chmod
. Je peux aussi écrire dans le terminal bash script.sh
et cela fonctionne de la même manière. Je sais que les scripts peuvent être exécutés en ajoutant une barre de point ./
à leur nom, comme ceci: ./script.sh
.
Alors, de quelle manière dois-je utiliser dans mon script Python? Pourquoi?
Tout d’abord, en ce qui concerne le point dans ./script.sh
, cela indique que script.sh se trouve dans le répertoire de travail, cela signifie quelque chose du type "recherchez script.sh ici, dans ce répertoire". Ceci est connu comme une barre oblique, et il est bien expliqué ici .
Je vois trois options:
Si vous avez l'intention de limiter l'exécution du fichier uniquement s'il se trouve dans le répertoire de travail actuel de l'utilisateur lorsqu'il exécute votre script Python, puis utilisez la barre oblique. Cependant, cela ne semble pas être la meilleure idée: cela entraînera des exceptions la plupart du temps.
Si vous avez l'intention de limiter l'exécution de votre script Shell uniquement s'il se trouve dans le même répertoire que votre script Python, il vous faudra alors recherchez le répertoire de votre script Python et préfixez-le au nom de votre script.
Si vous avez l'intention de placer votre script Shell ailleurs dans votre PATH, n'utilisez pas la barre oblique.
Maintenant, envoyer "bash" comme argument au constructeur Popen semble plus être une question de préférence. Si vous ne souhaitez pas l'envoyer sous forme d'argument, vous devez ajouter un Shebang au script Shell, par exemple. #!/bin/bash
, et , vous devrez y ajouter des autorisations d'exécution. Ce sont des choses parfaitement acceptables à faire.
Un des avantages de le faire de cette façon est que si vous modifiez ultérieurement l'interpréteur Shell, il ne sera pas nécessaire de modifier chaque appel de ce script pour savoir combien de scripts Python.
Et on peut simplement appeler le script comme suit:
cmd = subprocess.call('script.sh')
# or
cmd = subprocess.call(sdir + 'script.sh')
# Where sdir stands for the script's directory,
# which you would need to find before, as in option #2.
Notes:
Même si votre script fonctionne normalement sans Shebang (dans ce cas, il est presque certainement exécuté par tiret et non par bash sur les distributions basées sur Debian), lors de son appel depuis python comme cela, il échouera et lèvera une exception OSError avec le code d'erreur 8 (errno.ENOEXEC).