Respostas:
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 o subprocess
módulo inteiro , mas essa abordagem
import os
os.system(command)
é um dos mais fáceis.
subprocess
você pode gerenciar tubos de entrada / saída / erro. Também é melhor quando você tem muitos argumentos - com os.command()
você terá que criar uma linha de comando inteira com caracteres especiais de escape, com subprocess
uma lista simples de argumentos. Mas tarefas simples os.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 () :
import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))
com test.sh
na mesma pasta:
#!/bin/sh
echo $1
echo $2
exit 0
Saídas:
$ python test.py
param1
param2
import os
import sys
Assumindo que test.sh é o script de shell que você deseja executar
os.system("sh test.sh")
Use o módulo de subprocesso, conforme mencionado acima.
Eu uso assim:
subprocess.call(["notepad"])
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.
import subprocess
output = subprocess.call(['test.sh'])
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.
import subprocess
from subprocess import Popen, PIPE
session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()
if stderr:
raise Exception("Error "+str(stderr))
3 - chame o script e despeje os comandos echo do temp.txt no arquivo temp_
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
output = file.read()
print(output)
Não se esqueça de dar uma olhada no subprocesso doc
O módulo de subprocesso é um bom módulo para iniciar subprocessos. Você pode usá-lo para chamar comandos de shell como este:
subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
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:
import os
os.system("your command here")
# or
os.system('sh file.sh')
Este comando executará o script uma vez, até a conclusão, e bloqueará até que saia.
Caso o script esteja tendo vários argumentos
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
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.
podname=xyz serial=1234
0
Abaixo está o script shell test.sh.
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
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:
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.
import subprocess
subprocess.run(['./test.sh'])