Primeiro, em relação ao ponto em ./script.sh
, isso indica que script.sh pode ser encontrado no diretório de trabalho, significa algo como "procurar por script.sh aqui, neste diretório". Isso é conhecido como barra de pontos, e é bem explicado aqui aqui .
Eu vejo três opções:
-
Se você pretende restringir o arquivo a ser executado apenas se ele estiver no diretório de trabalho atual do usuário quando ele executar seu script Python, use a barra de pontos. No entanto, isso não parece ser a melhor ideia: ele levará a exceções na maioria das vezes.
-
Se você pretende restringir seu script de shell a ser executado apenas se ele estiver no mesmo diretório que seu script Python, será necessário encontre o diretório do seu script Python e prefixe-o ao nome do seu script.
-
Se você pretende colocar seu script de shell em outro lugar em seu PATH, não use a barra de pontos.
Agora, enviar "bash" como um argumento para o construtor Popen parece mais uma questão de preferência. Se você não quiser enviá-lo como argumento, você precisará adicionar um shebang ao script de shell, por exemplo #!/bin/bash
, e você precisará adicionar permissões de execução a ele. Estas são coisas perfeitamente aceitáveis para fazer.
Uma vantagem de fazer isso dessa forma é se, posteriormente, um mudar o interpretador de shell, não será necessário modificar todas as chamadas para aquele script em quem sabe quantos scripts Python.
E pode-se apenas chamar o script como:
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.
Notas:
Mesmo que o seu script seja executado sem um shebang normalmente (caso em que quase certamente é executado por traço e não por bash em distribuições baseadas no Debian), ao chamá-lo de python como este, ele irá falhar e gerar uma exceção OSError com errno 8 (errno.ENOEXEC).