Как вызвать оболочку script из кода python?

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

Ответ 1

Модуль subprocess поможет вам.

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

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

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

Ответ 2

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

import os
os.system(command)

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

Ответ 3

Если вы хотите передать некоторые параметры своей оболочке script, вы можете использовать метод 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

Ответ 4

import os
import sys

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

os.system("sh test.sh")

Ответ 5

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

Я использую его следующим образом:

subprocess.call(["notepad"])

Ответ 6

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

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

1 - вызов script. Вы увидите вывод в своем терминале. output - это число.

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 - вызовите script и выгрузите команды эха 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

Ответ 7

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

#!/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"

Ответ 8

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

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

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

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

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

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

Ответ 9

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

Два недостатка сценария:

  • Текущий уровень документации будет более всеобъемлющим, даже если он достаточен.
  • В отличие от подпроцесса, пакет scriptine по умолчанию не установлен.

Ответ 10

Я знаю, что это старый вопрос, но я наткнулся на это в последнее время, и это в конечном итоге дезинформирует меня с подпроцессом API, как изменились с тех пор питона 3.5.

Новый способ выполнения внешних скриптов - с помощью функции run.

Import subprocess

subprocess.run(['./test.sh'])

Ответ 11

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

Import Execute 

Execute("zbx_control.sh")