iter(subprocess.Popen_instance.stdout.readline,'')是一个繁忙的循环吗?

时间:2017-08-09 18:26:34

标签: python subprocess

让我们考虑以下代码构造:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, ''):
    print(line)

这个for循环是一个繁忙的循环,还是会等待来自进程的输出数据?我怎么检查这个?无论答案是什么,它是CPython语言规范或实现细节的一部分吗?

我对Python 2.x和Python 3.x感兴趣,主要操作系统(Windows,macOS,Linux)及其各自的内核。

1 个答案:

答案 0 :(得分:2)

由于readline阻塞,所以循环只有可用于读取的输出一样繁忙。

从命令行测试:

#!/usr/bin/env python

import subprocess
args = ('cat', '-')
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, ''):
    print(line.rstrip('\n'))


$ ./x.py
a
a
b
b
<Ctrl-D>