遍历尚未满的文本流

时间:2019-06-25 15:42:56

标签: python

我有以下功能代码来输出实时子流程stdout数据。

import subprocess

ps = subprocess.Popen(
   'ls && sleep 5 && ls',
    stdout=subprocess.PIPE,
    shell=True,
    encoding='utf-8'
)

for item in ps.stdout:
    if item:
        print(item)
    else:
        break

print('process has terminated')

这将打印ls的结果,等待五秒钟,然后再次打印ls的结果。

我不明白的是为什么for item in ps.stdout以这种方式工作。我认为它将打印第一个ls的结果,然后到达stdout的末尾,并打印最后的process has terminated

我最好的猜测是它与可迭代/生成器/流行为有关吗?洞察力受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

for将继续,直到收到来自迭代器的“结束”信号为止。 stdout是活动管道的交付端;只要该管道是开放的,就没有“结束”信号。 for将等待管道的进一步响应;这就是管道的工作方式。

如果管道不能以这种方式工作,则接收端将需要与子进程进行异步通信,以了解是否还需要其他数据。