也许我需要的是对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
只是 整数(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 上可能不需要。
关于python - 从 Popen 捕获输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31209985/