Como chamar um script de shell a partir do código python?


210

Como chamar um script de shell a partir do código python?

Respostas:


252

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.shestá um script de shell simples e 0é seu valor de retorno para esta execução.


11
Nota: é preferível passar subprocess.call () uma lista em vez de uma string (consulte o comando Hugo24 abaixo para obter exemplos e razões).
Jim Dennis

1
O link para o tutorial está quebrado.
Kshitij Saraogi

6
Isso fornece: OSError: [Erro 13] Permissão negada. meu script não é necessário para rodar com o sudo. @Manoj Govindan
alper

6
Com argumentos: subprocess.call (['./ test.sh', 'param1', 'param2'])
Henry

2
@alper vá para a pasta onde você colocou o script e execute o comando chmod +x script.sh,. Nota: script.sh é um espaço reservado para seu script, substitua-o de acordo.
Tom J Muthirenthi

105

Existem algumas maneiras de usar os.popen()(descontinuado) ou o subprocessmódulo inteiro , mas essa abordagem

import os
os.system(command)

é um dos mais fáceis.


1
por que essa não é a resposta mais votada? Não é necessário importar um módulo a melhor solução? Deve haver alguma desvantagem aqui?
precisa saber é o seguinte

6
Com subprocessvocê 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 subprocessuma lista simples de argumentos. Mas tarefas simples os.command() podem ser suficientes.
Michał Niklas 19/01

1
Para citar esse link:The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; *using that module is preferable to using this function.*
Maximilian

42

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.shna mesma pasta:

#!/bin/sh
echo $1
echo $2
exit 0

Saídas:

$ python test.py 
param1
param2

Isso é elegante.
22719

20
import os
import sys

Assumindo que test.sh é o script de shell que você deseja executar

os.system("sh test.sh")

15

Use o módulo de subprocesso, conforme mencionado acima.

Eu uso assim:

subprocess.call(["notepad"])

13
Nota: chamar o subprocesso com uma lista é mais seguro, pois não requer a passagem da cadeia de caracteres (potencialmente não -anitizada) por um shell para análise / interpretação. O primeiro item da lista será o executável e todos os outros itens serão passados ​​como argumentos.
Jim Dennis

13

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


1
Nota Não use stdout = PIPE ou stderr = PIPE com 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.

4

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.


Você não precisa importar o sistema também?
precisa saber é o seguinte

Não você não; tente abrir um shell Python e correr esse trecho
Descartes

4

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"


2

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 runfunçã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'])

1

Se o seu arquivo de script shell não tiver permissões de execução, faça-o da seguinte maneira.

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

-9

Tente os seguintes códigos:

Import Execute 

Execute("zbx_control.sh")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.