2013-06-21 3 views
15

Как мне запустить скрипт bash с помощью модуля подпроцесса, которому я должен дать несколько аргументов?Python: подпроцесс и запуск сценария bash с несколькими аргументами

Это то, что я в настоящее время с помощью:

subprocess.Popen(['/my/file/path/programname.sh', 'arg1 arg2 %s' % arg3], \ 
    shell = True) 

Скрипт Баш, кажется, не принимать какие-либо из параметров в Любые идеи очень ценятся.!

ответ

28

Pass аргументы в виде списка, см the very first code example in the docs:

import subprocess 

subprocess.check_call(['/my/file/path/programname.sh', 'arg1', 'arg2', arg3]) 

Если arg3 не является строкой; преобразуйте его в строку перед переходом на check_call(): arg3 = str(arg3).

+0

Если все мои аргументы являются переменными, не устанавливайте их как строки? – user2510173

+0

@ user2510173: Я не понимаю, квесты на. Вот пример: 'arg3 = 1', чтобы преобразовать его, вы можете вызвать' str (arg3) ', который возвращает' '1''. – jfs

+2

К сожалению, пример в коде не отвечает на исходный вопрос, так как они выбрали слишком простой случай только одного аргумента. Непонятно, следует ли передавать несколько аргументов в виде одной строки или как несколько, если вы плохо читаете страницу на деталях позади POpen. Даже тогда он говорит только: «Предоставление последовательности аргументов в целом предпочтительнее» - не, «вы должны предоставить несколько аргументов в виде списка» –

0

Вы забыли добавить args имя.

subprocess.Popen(args=['./test.sh', 'arg1 arg2 %s' % arg3], shell=True) 
+0

так что путь к файлу должен быть также установлен в args? – user2510173

3
subprocess.Popen(['/my/file/path/programname.sh arg1 arg2 %s' % arg3], shell = True). 

Если вы используете shell = True сценарий и его аргументы должны быть переданы в виде строки. Любые другие элементы в последовательности args будут рассматриваться как аргументы оболочки.

Вы можете найти полные документы по адресу http://docs.python.org/2/library/subprocess.html#subprocess.Popen.

1

Привет, я знаю, что это решение довольно поздно, но может помочь кому-то.

пример:

import subprocess 
pass_arg=[] 
pass_arg[0]="/home/test.sh" 
pass_arg[1]="arg1" 
pass_arg[2]="arg2" 

subprocess.check_call(pass_arg) 

Приведенный выше пример дает arg1 и arg2 в качестве параметров сценария оболочки test.sh

По существу, подпроцесс ожидает массив. Таким образом, вы можете заполнить массив и предоставить его в качестве параметра.

0

Еще один пример, который не входит во все те выше,

subprocess.Popen ([ '/ ваш/script.sh% s% s% s' % (argument1, argument2, argument3)] , shell = True)

Обратите внимание, что при вводе% (аргумент1, аргумент2, аргумент3) не должно быть пробелов между% и (, например,% (аргумент1, аргумент2, аргумент3) недействителен.