2015-07-03 61 views
1

也许我需要的是对STDOUT是什么的一般解释,但这是我的问题。我需要在python中的一堆文件对中运行shell脚本,并解析输出。如果我运行:从Popen捕获输出

from itertools import combinations 
from subprocess import Popen 

for pair in combinations(all_ssu, 2): 
    Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
    ) 

...这似乎工作大(注:all_ssu是文件名实质上的列表)。 shell打印出一串我想要比较的数据。那么,如何将打印的数据打印到列表或数据框中,以便我可以使用它?

环视文档和这里其他一些问题之后,它看起来像stdout标志是寻找一个文件对象,所以我尝试:

from itertools import combinations 
from subprocess import Popen 
for pair in combinations(all_ssu, 2): 
    out_file = open('tmp.txt', 'rw') 
    Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
     stdout=out_file 
    ) 
    for line in out_file.readlines(): 
     print line 
    out_file.close() 

,这也似乎工作,但我创建那个我不需要的临时文件。我试图设置一个变量capturedNone,然后把stdout=captured,但在这种情况下,它只是将captured设置为0.我也试过out = Popen(...)没有stdout标志,但再次,out只是int(0)。我也尝试玩PIPE,但无法做到正面或反面。

所以问题是:我如何直接从Popen捕获输出?

+1

当您使用'PIPE'时,使用'Popen.communicate'从管道中读取。 Python在线文档确实有很好的例子。 –

回答

2

试试这个:

from itertools import combinations 
from subprocess import Popen, PIPE 
for pair in combinations(all_ssu, 2): 
    out = Popen(
     ['blastn', 
     '-query', 'tmp/{0}.fna'.format(pair[0]), 
     '-subject', 'tmp/{0}.fna'.format(pair[1]), 
     '-outfmt', '6 qseqid sseqid pident' 
     ], 
     stdout=PIPE 
    ).communicate[0] 
    print(out) 

How can I get terminal output in python?

stdout是公正的程序,这是该文件的标准输出,其中,该程序将打印将被写入任何东西。

如果你想在输出作为一个列表,那么你可以在循环之前只是创建一个空的列表(l = []或东西),并在每次循环

3

从Python 2.7版的结尾做l.append(out)起,你可以使用 - subprocess.check_output

它将执行的命令的输出返回为字节字符串。

示例 -

>>> import subprocess 
>>> s = subprocess.check_output(["echo","Hello World!"], shell=True) 
>>> s 
b'"Hello World!"\r\n' 

我不得不用我的窗户shell=True这个工作,但在Linux上,这可能是不需要的。

+0

请注意,'subprocess.check_output'在Python 2.7中是新增的。通常这不是问题,但要记住是很好的。 –

+0

谢谢,补充说,答案。 –