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.