2010-09-23 2 views

ответ

152

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

Грубо тривиальный пример:

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

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

+8

Примечание: это предпочтительнее передать подпроцесс .call(), а не строку (см. команду Hugo24 ниже для примера и причин). –

+1

Ссылка на учебник сломана. –

+0

Это дает: OSError: [Errno 13] Разрешение отклонено. мой скрипт не требуется работать с sudo. @Manoj Govindan – Alper

51

Есть несколько способов, с помощью os.popen() (устаревшее) или всего subprocess модуля, но this approach

import sys, os 

os.system(command) 

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

+0

Почему это не самый лучший ответ? Разве не нужно импортировать модуль, лучшее решение? Должен быть какой-то недостаток здесь? –

+3

С помощью 'subprocess' вы можете управлять каналами ввода/вывода/ошибок. Также лучше, когда у вас много аргументов - с 'os.command()' вам нужно будет создать целую командную строку с экранированием специальных символов, а подпроцессом будет простой список аргументов. Но для простых задач 'os.command()' может быть достаточно. –

+0

Процитировать по этой ссылке: 'Модуль подпроцесса предоставляет более мощные средства для нереста новых процессов и получения их результатов; * использование этого модуля предпочтительнее использования этой функции. * ' – Maximilian

12

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

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

subprocess.call(["notepad"]) 
+11

Примечание: вызов подпроцесса со списком является более безопасным, поскольку он не требует передачи (потенциально unsanitized) строки через оболочку для синтаксического анализа/интерпретации. Первым элементом в списке будет исполняемый файл, и все остальные элементы будут переданы в качестве аргументов. –

2

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

Два недостатки scriptine:

  • Текущий уровень документация будет более полным, хотя достаточно.
  • В отличие от подпроцесса, пакет скриптинга по умолчанию не установлен.
-7

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

Import Execute 

Execute("zbx_control.sh") 
27

В случае, если вы хотите передать некоторые параметры вашего скрипта, вы можете использовать метод 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 
13
import os 
import sys 

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

os.system("sh test.sh") 
0

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

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

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

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

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

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

6

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

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

1 - вызов сценария. Вы увидите вывод в своем терминале. 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 - вызов сценария и сбросить эхо команд 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 subprocess

Смежные вопросы