Skip to main content
 首页 » 编程设计

python之从 Popen 捕获输出

2025年05月04日35mayingbao

也许我需要的是对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 上可能不需要。