从Popen捕获输出
也许我需要的是对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()
,这也似乎工作,但我创建那个我不需要的临时文件。我试图设置一个变量captured
到None
,然后把stdout=captured
,但在这种情况下,它只是将captured
设置为0.我也试过out = Popen(...)
没有stdout
标志,但再次,out
只是int(0)
。我也尝试玩PIPE
,但无法做到正面或反面。
所以问题是:我如何直接从Popen
捕获输出?
试试这个:
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 = []
或东西),并在每次循环
从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上,这可能是不需要的。
请注意,'subprocess.check_output'在Python 2.7中是新增的。通常这不是问题,但要记住是很好的。 –
谢谢,补充说,答案。 –
当您使用'PIPE'时,使用'Popen.communicate'从管道中读取。 Python在线文档确实有很好的例子。 –