【发布时间】:2017-07-06 16:45:09
【问题描述】:
我想在打印时捕获输出,但我会永远阻塞,甚至连一行都不读。 发生了什么?我正在使用 Python2。
生成器脚本:
#!/usr/bin/env python2.7
import random
import time
while True:
print(random.random())
time.sleep(1)
样本生成器输出:
$ ./generator.py
0.334835137212
0.896609571236
0.833267988558
0.55456332113
^CTraceback (most recent call last):
阅读器脚本:
import subprocess
cmd = ['./generator.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
print(line)
print('Looping')
p.wait()
我也试过了:
import subprocess
import sys
cmd = ['./generator.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
while True:
line = p.stdout.readline()
print(line)
print('Looping')
p.wait()
...和:
import sys
import subprocess
import select
import time
cmd = ['./generator.py']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
s = select.poll()
s.register(p.stdout, select.POLLIN)
while True:
if s.poll(1):
line = p.stdout.read()
else:
p.poll()
if p.returncode is not None:
break
print('Looping')
time.sleep(1)
p.wait()
【问题讨论】:
-
你应该使用
p.communicate(),而不是直接使用stdout。见docs.python.org/2/library/… ... -
你是如何执行这些脚本的?从
stdout读取不是通常的进程间通信尝试。 -
@CorleyBrigman 使用communicate() 对长时间运行的进程毫无用处。直到最后你才能打印出来。
-
@Prune IPC 不是必需的。我需要做的就是在捕获输出时迭代地打印输出。
-
这在生成器中缺少
sys.stdout.flush()(或flush=True)。否则,您将不得不等到它填满输出缓冲区,这 -- 鉴于sleep(1)-- 可能需要一段时间。
标签: python