[英]Capturing output from Popen
也许我需要的是对STDOUT
的一般解释,但这是我的问题。 我需要在一堆文件对上的python中运行shell脚本,然后解析输出。 如果我运行:
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
的输出?
从Python 2.7开始,您可以使用subprocess.check_output
它以字节字符串形式返回执行命令的输出。
范例-
>>> import subprocess
>>> s = subprocess.check_output(["echo","Hello World!"], shell=True)
>>> s
b'"Hello World!"\r\n'
我必须在Windows上使用shell=True
才能工作,但是在linux上可能不需要。
尝试这个:
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)
STDOUT只是程序的标准输出,该文件是程序将打印到的任何内容的文件。
如果要将输出作为列表,则可以在循环之前创建一个空列表( l = []
或其他内容),并在循环的每次迭代结束时执行l.append(out)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.