我正在尝试为子进程实时打印标准输出,但看起来标准输出即使在 bufsize=0 的情况下也被缓冲了,我不知道如何使它工作,我总是有延迟。
我试过的代码:
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
bufsize=0)
line = p.stdout.readline()
while line:
sys.stdout.write(line)
sys.stdout.flush()
# DO OTHER STUFF
line = p.stdout.readline()
还尝试了 withfor line in iter(p.stdout.readline, b'')
而不是 while 循环和 withread(1)
而不是readline()
. 总是相同的结果,输出会延迟很多秒或几分钟,并且会突然出现多行。
我认为会发生什么:
bufsize
设置为 0(根据文档默认设置为 0),因此管道传输到的行p.stdout
应该立即可用。但是由于p.stdout.readline()
在管道传输新行时不会立即返回,这意味着它是缓冲的,因此当缓冲区最终刷新到p.stdout
.
我该怎么做才能让它发挥作用?