2012-06-01 3 views
1

Я пытаюсь написать скрипт python для выполнения командной строки с параметрами, импортированными из другого файла. Интерфейс командной строки для программы работает следующим образом: ./executable.x параметр (а) параметр (б) параметр (с) ...Python: Как выполнить внешнюю программу с параметрами из другого файла?

Мой код:

#program to pass parameters to softsusy 
import subprocess 
#open parameter file 
f = open('test.dat', 'r') 
program = './executable.x' 
#select line from file and pass to program 
for line in f: 
    subprocess.Popen([program, line]) 

тест. dat-файл выглядит следующим образом:

param(a) param(b) param(c)... 

Сценарий вызывает программу, однако не передает переменные. Что мне не хватает?

ответ

1

Вы хотите:

line=f.readline() 
subprocess.Popen([program]+line.split()) 

То, что вы в настоящее время будет проходить всю линию к программе в качестве единственного аргумента. (Например, назвав его в оболочке, как program "arg1 arg2 arg3"

Конечно, если вы хотите, чтобы вызвать программу один раз для каждой строки в файле:

with open('test.dat','r') as f: 
for line in f: 
    #you could use shlex.split(line) as well -- that will preserve quotes, etc. 
    subprocess.Popen([program]+line.split()) 
+0

Это работало отлично. Спасибо за помощь. – user1431534

+0

Как я могу сохранить вывод из подпроцесса в файл? – user1431534

+0

Создайте файл-объект ('outputfile = open ('output.txt', 'w')') и передайте его Popen с помощью ключевого слова 'stdout': (' subprocess.Popen (arglist, stdout = outputfile) ') – mgilson

0

Начнем с того, для вас случае, использование subprocess.call() not subprocess.popen()

Что касается параметров, которые не передаются, в вашем скрипте нет ничего явно неправильного. Попробуйте объединить все это в длинную строку и присвоить строку .call() вместо списка .

subprocess.call(program + " " + " ".join(line)) 

Вы уверены, что line содержит данные, которые вы ожидаете, что они содержат?

Чтобы убедиться, (если исходный файл коротка) попробуйте включить этот файл в список явно и убедившись, что есть данные в «линии»:

for line in file.readlines(): 
    if len(line.trim().split(" ")) < 2: 
     raise Exception("Where are my params?") 
+0

Строка содержит одну строку файла. если строка была «привет», ваше решение передало бы «h e l l o» каждый в качестве аргументов. И нет никакой реальной проблемы с использованием 'Popen' - использование' call' - это просто оболочка вокруг «Popen». – mgilson

+0

Кроме того, 'line.trim()' будет поднимать AttributeError, поскольку строки не имеют метода обрезки. (по крайней мере, не в python 2.6). 'line.split()' должен работать нормально. – mgilson

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