2013-06-20 3 views
4

Привет, Я довольно новичок в Python, и я пытаюсь вызвать подпроцесс из другого скрипта Python с помощью subprocess.call. Но мои аргументы - это имена переменных. Итак, следует ли использовать subprocess.call или subprocess.popen?Подпроцессный вызов с аргументами как переменные python

Я хочу, чтобы выполнить следующую команду из другого питона сценария:

python npp.python -i fname -o fname+"out" -l fname+"log" -e excplist -i ignorelist 

Итак, я должен сделать

subprocess.Popen(['python', 'npp.python', '-i', fname , 'o', fname+"out", '-l', fname+"log", '-e', excplist,'-i',ignrlist]).communicate() 

Я не могу назвать другую программу, делая это. Любые предложения о том, что я делаю неправильно?

+3

У вас есть правильная идея, но отсутствует '-' в опции' -o'. –

+0

'subprocess.call' в основном' subprocess.Popen', но он возвращает код выхода. Используйте 'subprocess.Popen'. Кроме того, можете ли вы сказать, что происходит не так? Почему код не работает? – refi64

+0

Что относительно 'sh' третьего модуля python? – Dreampuf

ответ

0

PJust для справки. Действительно простой способ сделать что-то вроде этого - это просто заранее определить команду и преобразовать ее в список аргументов.

command = "python npp.python -i {file} -o {file}.out -l {file}.log -e {excep} -i {ignore}".format(file=pipe.quote(fname), excep=exceptlist, ignore=ignorelist) 

subprocess.call(shlex.split(command)) # shlex.split is safer for shell commands than the usual split 
# or popen if the return code isn't needed 
subprocess.Popen(shlex.split(command)) 

Таким образом, при написании вашей команды в форме списка сложнее сделать ошибки.

+0

Если вам нужен список, создайте список. Не начинайте со строки и конвертируйте ее в список. –

+0

Не возражаете ли вы разобраться, почему не следует делать выше. Я понимаю, что он добавляет дополнительный шаг в программу, но это делает просмотр команды намного приятнее. По-моему, он легко решает проблему создания глупых синтаксических ошибок при создании команды в форме списка, особенно если ее долго похоже на случай OPs. Многие другие делают это так же: http://stackoverflow.com/questions/4091242/subprocess-call-requiring-all-parameters-to-be-separated-by-commas – cwoebker