Como chamar um script de shell a partir do código python?
210
O módulo do subprocesso o ajudará.
Exemplo descaradamente trivial:
>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
Onde test.sh
está um script de shell simples e 0
é seu valor de retorno para esta execução.
chmod +x script.sh
,. Nota: script.sh é um espaço reservado para seu script, substitua-o de acordo.Existem algumas maneiras de usar
os.popen()
(descontinuado) ou osubprocess
módulo inteiro , mas essa abordagemé um dos mais fáceis.
fonte
subprocess
você pode gerenciar tubos de entrada / saída / erro. Também é melhor quando você tem muitos argumentos - comos.command()
você terá que criar uma linha de comando inteira com caracteres especiais de escape, comsubprocess
uma lista simples de argumentos. Mas tarefas simplesos.command()
podem ser suficientes.The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Caso deseje passar alguns parâmetros para o seu script de shell, você pode usar o método shlex.split () :
com
test.sh
na mesma pasta:Saídas:
fonte
Assumindo que test.sh é o script de shell que você deseja executar
fonte
Use o módulo de subprocesso, conforme mencionado acima.
Eu uso assim:
fonte
Estou executando o python 3.5 e subprocess.call (['./ test.sh']) não funciona para mim.
Eu lhe dou três soluções depende do que você quer fazer com a saída.
1 - script de chamada. Você verá a saída no seu terminal. saída é um número.
2 - chamar e despejar execução e erro na string. Você não vê execução no seu terminal, a menos que imprima (stdout). Shell = True como argumento no Popen não funciona para mim.
3 - chame o script e despeje os comandos echo do temp.txt no arquivo temp_
Não se esqueça de dar uma olhada no subprocesso doc
fonte
subprocess.call
. O processo filho será bloqueado se gerar saída suficiente para um canal para preencher o buffer do canal do SO, pois os canais não estão sendo lidos.O módulo de subprocesso é um bom módulo para iniciar subprocessos. Você pode usá-lo para chamar comandos de shell como este:
Você pode ver a documentação aqui.
Se você tiver seu script gravado em algum arquivo .sh ou em uma sequência longa, poderá usar o módulo os.system. É bastante simples e fácil de ligar:
Este comando executará o script uma vez, até a conclusão, e bloqueará até que saia.
fonte
Caso o script esteja tendo vários argumentos
A saída fornecerá o código de status. Se o script for executado com sucesso, ele fornecerá 0, caso contrário, um número inteiro diferente de zero.
Abaixo está o script shell test.sh.
fonte
O subprocesso é bom, mas algumas pessoas podem gostar mais do scriptine . O Scriptine possui um conjunto de métodos de alto nível, como shell.call (args) , path.rename (new_name) e path.move (src, dst) . O Scriptine é baseado no subprocesso e outros.
Duas desvantagens da scriptine:
fonte
Eu sei que essa é uma pergunta antiga, mas eu me deparei com isso recentemente e acabou me desviando desde que a API do Subprocess foi alterada desde o python 3.5.
A nova maneira de executar scripts externos é com a
run
função, que executa o comando descrito por args. Aguarda a conclusão do comando e retorna uma instância de CompletedProcess.fonte
Se o seu arquivo de script shell não tiver permissões de execução, faça-o da seguinte maneira.
fonte
Tente os seguintes códigos:
fonte