2014-02-14 2 views
0

Я работаю с кодом на Python, который использует некоторые программы, доступные только из моего терминала Unix (ОС Windows 7, используя терминал шпатлевки). Я уже просмотрел множество статей, я знаю, что подобные вопросы заданы, но ничего не работает меня.Подпроцесс Python - переменные типы?

Это код

#written in Py 2.7 

from subprocess import call 

subject = open ('test_file1', 'r') 
target =open ('test_file2', 'r') 
output = open ('output_test.bla8', 'w') 
call(['blat', '-prot', '-minScore=0', '-stepSize=5', '-repMatch=2253', '-minIdentity=0', '-out=blast8', subject, target, output]) 
subject.close() 
target.close() 
output.close() 

Ошибка я получаю это:

TypeError: execv() arg 2 must contain only strings 

Так немного объяснения, «блат» это программа, которую я зову, все -flags являются аргументы, которые я хочу передать в программу blat и последние три оператора, также являются аргументами, которые мне нужно получить, чтобы программа, но они на самом деле определяют файлы для программы для чтения/записи.

Есть ли способ передать значения аргумента команде оболочки, которая на самом деле является файлом, если не используется 'subprocess.call'? Конечно, есть простой способ добиться этого, что, как я начинаю, я просто не знаю. Кстати, я взглянул на документы подпроцесса, но как новичок я все еще не могу это получить http://docs.python.org/2/library/subprocess.html#subprocess.call

СПАСИБО !!!

+1

ли blat' означало 'взять имена файлов или ручки? Моя ставка заключается в том, что вы передаете файловые объекты в списке компонентов команд для 'call' и ожидает только строки. Вы ищете «stdin» и «stdout» kwargs? –

+0

Да, ваша догадка была правильной. Функция вызова принимает только строки. Я не думаю, что можно делать то, что я пытаюсь. Я столкнулся с проблемой, создав список необходимых мне входных файлов, а затем подав их на вызов() с индексированием (код ниже в качестве нового ответа). Спасибо, Сайлас! – JayB

ответ

3

Когда вы делаете:

f = open('file','r')

ваш Python процесс открытия файла и сохранение файла дескриптора/объект в ф. Этот дескриптор/объект открытого файла не может быть помещен в командную строку (вы не можете ввести его), поэтому вы получаете ошибку от call, которая принимает аргументы командной строки.

Если ваша программа «blat» принимает имена файлов и открывает файл в собственном процессе, вы должны просто удалить вызовы open и просто поместить имена файлов непосредственно в вызов call. Если это не то, что делает блат, вам нужно понять, как он получает свои данные и передает их в этой форме.

+0

Ваш вопрос дал мне только вдохновение, в котором я нуждался. Вы правы, что blat может открывать файлы через свои собственные процессы. Однако мне нужно использовать varaible, а не жестко-кодирование дескриптора файла, потому что в конце концов я хочу построить цикл, который будет запускать эту блатную программу для многих файлов. Я решил проблему, используя ваши предложения, хотя код ниже. Это так просто, почему я не подумал об этом раньше ?! Спасибо, Питер! – JayB

0

Я решил эту проблему, используя этот код:

new_list= [] 
for file in os.listdir('.'): 
    if fnmatch.fnmatch(file, '*.fa'): 
    new_list.append(file) 

input_file1 = new_list[0] 
input_file2 = new_list[1] 
blat =call(['blat', '-prot', '-minScore=0', '-stepSize=5', '-repMatch=2253', 'minIdentity=0', '-out=blast8', input_file1 , input_file1, 'output_test']) 
Смежные вопросы