Как вызвать скрипт из кода Python? - PullRequest
175 голосов
/ 23 сентября 2010

Как вызвать скрипт оболочки из кода Python?

Ответы [ 10 ]

210 голосов
/ 23 сентября 2010

Модуль подпроцесса поможет вам.

явно тривиальный пример:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

Где test.sh - простой скрипт оболочки, а 0 - возвращаемое значение для этого прогона.

83 голосов
/ 23 сентября 2010

Есть несколько способов использования os.popen() (устарело) или всего модуля subprocess, но этот подход

import os
os.system(command)

является одним из самых простых.

36 голосов
/ 13 августа 2015

Если вы хотите передать некоторые параметры в ваш скрипт оболочки, вы можете использовать метод shlex.split () :

import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))

с test.sh в той же папке:

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

Выходы:

$ python test.py 
param1
param2
18 голосов
/ 30 ноября 2015
import os
import sys

Предполагается, что test.sh - это скрипт оболочки, который вы хотите выполнить

os.system("sh test.sh")
13 голосов
/ 23 сентября 2010

Используйте модуль подпроцесса, как указано выше.

Я использую это так:

subprocess.call(["notepad"])
12 голосов
/ 05 сентября 2016

Я использую python 3.5, и subprocess.call (['./ test.sh']) не работает для меня.

Я даю вам три решения, зависит от того, что вы хотите сделать с выходом.

1 - скрипт вызова. Вы увидите вывод в вашем терминале. выходной это число.

import subprocess 
output = subprocess.call(['test.sh'])

2 - вызов и сброс дампа и ошибка в строку. Вы не увидите выполнение в своем терминале, если не печатаете (stdout). Shell = True, поскольку аргумент в Popen не работает для меня.

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 - вызвать скрипт и вывести команды echo файла temp.txt в файл temp_file

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)

Не забудьте взглянуть на подпроцесс doc

4 голосов
/ 27 декабря 2018

В случае, если сценарий имеет несколько аргументов

#!/usr/bin/python

import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output

Вывод выдаст код состояния.Если скрипт выполняется успешно, он даст 0, иначе ненулевое целое число.

podname=xyz  serial=1234
0

Ниже приведен скрипт оболочки test.sh.

#!/bin/bash

podname=$1
serial=$2
echo "podname=$podname  serial=$serial"
3 голосов
/ 16 июня 2016

Модуль подпроцесса - хороший модуль для запуска подпроцессов. Вы можете использовать его для вызова команд оболочки следующим образом:

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

Здесь вы можете увидеть документацию .

Если ваш скрипт написан в каком-то файле .sh или длинной строке, то вы можете использовать модуль os.system. Это довольно просто и легко позвонить:

import os
os.system("your command here")
# or
os.system('sh file.sh')

Эта команда будет запускать сценарий один раз, до завершения и блокировать до его выхода.

2 голосов
/ 03 февраля 2013

Подпроцесс хорош, но некоторым людям может понравиться скриптин лучше. Scriptine имеет более высокоуровневый набор методов, таких как shell.call (args) , path.rename (new_name) и path.move (src, dst), Скриптин основан на подпроцессе и др.

Два недостатка скриптинга:

  • Текущий уровень документации будет более полным, даже если этого достаточно.
  • В отличие от подпроцесса, пакет сценариев в настоящее время не установлен по умолчанию.
0 голосов
/ 16 марта 2015

Пожалуйста, попробуйте следующие коды:

Import Execute 

Execute("zbx_control.sh")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...