Tenho um problema com o seguinte código:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
Quero que o "final" seja impresso após 10s. (Eu sei que este é um exemplo idiota, eu poderia simplesmente dormir dentro do python, mas este arquivo sleep.sh simples foi apenas como um teste)
Respostas:
Tornar o sleep.sh executável e adicionar
shell=True
à lista de parâmetros (como sugerido nas respostas anteriores) funciona bem. Dependendo do caminho de pesquisa, você também pode precisar adicionar./
ou algum outro caminho apropriado. (Ou seja, mude"sleep.sh"
para"./sleep.sh"
.)O
shell=True
parâmetro não é necessário (em um sistema Posix como o Linux) se a primeira linha do script bash for um caminho para um shell; por exemplo#!/bin/bash
,.fonte
Se
sleep.sh
tiver o shebang#!/bin/sh
e as permissões de arquivo apropriadas - executechmod u+rx sleep.sh
para certificar-se de que está dentro,$PATH
então seu código deve funcionar como está:Se o script não estiver no PATH, especifique o caminho completo para ele, por exemplo, se estiver no diretório de trabalho atual:
Se o script não tiver nenhum shebang, você precisará especificar
shell=True
:Se o script não tiver permissões executáveis e você não puder alterá-lo, por exemplo, executando
os.chmod('sleep.sh', 0o755)
, você pode ler o script como um arquivo de texto e passar a string para osubprocess
módulo:fonte
Na verdade, você só precisa adicionar o
shell=True
argumento:Mas cuidado -
fonte
fonte
sleep.sh
não estiver noPATH
. E se estiver no caminho e tiver o conteúdo correto, você não precisashell=True
. Veja minha respostaSe alguém procura chamar um script com argumentos
Lembre-se de converter os args em string antes de passar, usando str (arg).
Isso pode ser usado para passar quantos argumentos desejar:
fonte
Certifique-se de que
sleep.sh
tem permissões de execução e execute-o comshell=True
:fonte
#!bin/bash
está ausente/
.#!/bin/bash
funciona como eu observo em uma resposta.Se o chmod não funcionar, você também tenta
teste por mim obrigado
fonte
os.system
documentação recomenda especificamente evitá-lo em favor desubprocess
(atualmente,subprocess.run()
). Se você não conseguesubprocess
trabalhar, é provável que tenha problemasos.system()
também.Adicionando uma resposta porque fui direcionado aqui depois de perguntar como executar um script bash em python. Você receberá um erro
OSError: [Errno 2] file not found
se o seu script aceitar parâmetros. Digamos, por exemplo, que seu script tenha um parâmetro de tempo de suspensão:subprocess.call("sleep.sh 10")
não funcionará, você deve passá-lo como uma matriz:subprocess.call(["sleep.sh", 10])
fonte
shell=True
mas sim, geralmente evitá-lo é sua melhor jogada.