2014-02-14 23 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 

所以稍微解释一下,“BLAT”是我调用程序,所有的-flags是我想传递给blat程序的参数和最后三个语句也是我需要编程的参数,但他们实际上指定了程序读取/写入的文件。

有没有办法将参数值传递给shell命令,如果没有使用'subprocess.call',它们实际上是文件?当然,有一种简单的方法可以实现这一点,就像我初学者一样,我只是不知道。顺便说一下,我已经看过子流程文档,但作为新手我还是不太明白http://docs.python.org/2/library/subprocess.html#subprocess.call

谢谢!

+1

是'blat'意味着接受文件名或手柄?我敢打赌,问题在于你正在将命令组件列表中的文件对象传递给'call',它只需要字符串。你在寻找'stdin'和'stdout' kwargs吗? –

+0

是的,你的直觉是正确的。调用函数只会使用字符串。我不认为有可能做我想做的事情。我通过创建一个我需要的输入文件列表来解决问题,然后用索引查找(code is below as a new answer)将它们提供给call()。谢谢,西拉斯! – JayB

回答

3

当你这样做:

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

的Python过程中打开该文件,并存储在F中的文件句柄/对象。这个打开的文件句柄/对象不能放在命令行上(你不能输入),所以你从call得到一个错误,它包含命令行参数。

如果您的'blat'程序需要文件名并在其自己的进程中打开该文件,您应该删除open调用,并直接将文件名放入call调用中。如果这不是什么瑕疵,那么你需要了解它是如何获取数据并以此形式传递的。

+0

你的问题给了我我需要的灵感。你是正确的,blat可以通过自己的进程打开文件。然而,我需要使用可变参数,而不是对文件句柄进行硬编码,因为最终我想构建一个循环,以便在许多文件上运行这个小程序。我使用你的建议解决了这个问题 - 代码如下。它非常简单,为什么我之前没有想到它?谢谢彼得! – 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'])