开发者社区> 问答> 正文

Python的select()延迟报告子流程输出的存在

我正在运行这个简单的Python程序,以合并两个子进程的输出行:

import select
from subprocess import PIPE, Popen
import sys

subprocs = [
    Popen(cmdline, stdout=PIPE) for cmdline in
    [['./repeat', 'abc'], ['./repeat', 'xyz']]
]
while True:
    rstreams, _, _ = select.select([p.stdout for p in subprocs], [], [])
    for stream in rstreams:
        sys.stdout.buffer.write(stream.readline())

…其中repeat是一个定期生成输出的简单脚本:

#!/bin/bash
while sleep 1 ; do echo $@ ; done

我希望将两个子流程的输出逐行合并,以便合并后的输出以任意顺序包含abc和xyz的行,并及时进行中继。(不需要混合数据,例如abxyzc。)

但是,我发现上面的Python程序很长一段时间都没有产生输出,或者直到我按下Ctrl C为止。

(我尝试将stream.readline()更改为stream.read(1),以防问题是readline()挂起,即使我不想这种交错,但并没有帮助。发生在Linux上的Python 3.5.2和macOS上的Python 3.7.6。)

当子流程清楚地生成输出时,为什么要选择select()呢?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 10:04:56 677 0
1 条回答
写回答
取消 提交回答
  • 根本原因是您使用了sys.stdout.buffer,它内部具有一个缓冲区,因此我们无法立即看到结果。

    我们可以在写入后显式刷新结果。将sys.stdout.buffer.flush()放在buffer.write()之后。或者只是使用print(stream.readline())而不是sys.stdout.buffer

    回答来源:stackoverflow

    2020-03-24 10:05:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载