我有以下功能代码来输出实时子流程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
。
我最好的猜测是它与可迭代/生成器/流行为有关吗?洞察力受到高度赞赏。
答案 0 :(得分:1)
for
将继续,直到收到来自迭代器的“结束”信号为止。 stdout
是活动管道的交付端;只要该管道是开放的,就没有“结束”信号。 for
将等待管道的进一步响应;这就是管道的工作方式。
如果管道不能以这种方式工作,则接收端将需要与子进程进行异步通信,以了解是否还需要其他数据。