python - 从 Popen 捕获输出

标签 python stdout

也许我需要的是对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/

相关文章:

python - 从距离矩阵数据帧中查找最小值的成对标签

python - MaxDoubleSliceSum 算法

c++ - 在 Unix 上重定向标准输出

bash - 有没有办法从脚本中将所有 stdout 和 stderr 重定向到 systemd 日志?

python - 将 stdout 从 subprocess.check_call 重定向到函数?

Python IDLE 无法启动 (Mac) - 来自 Python/Unix 新手的问题

python - 使用 Twitter Bootstrap 时通过 Flask Request 对象处理点击

python - gunicorn 会导致 exscript/paramiko 出现问题吗?

python - 如何将utf-8输出重定向到txt文件

perl - STDOUT 是什么类型,我如何选择写入它?