我试图在一个线程中运行一个子进程,该进程将定期输出数据(但通常是每秒输出一次以上)。
然而,当试图读取进程的stdout时,communicate(timeout=2)总是遇到一个TimeoutError,即使当有效的stdout数据是可用的时候也是如此。
代码运行在一个烧瓶应用程序中,在一个由daemon=True生成的线程中。
我试图运行的过程是
print("A")
time.sleep(1)
print("B")
time.sleep(5)
print("C")
exit()这应该是给我两个"A“和"B”而不打超时。
这是应该为我提供输出的循环:
with Popen(
args=[get_python_path(), path.join(
self.path, "output.py")],
stdout=PIPE, stderr=PIPE, universal_newlines=True) as proc:
self.status = RNNTrainer.STARTED
status = None
while status == None:
try:
stdout, stderr = proc.communicate(timeout=2)
print(stdout)
status = proc.returncode
except TimeoutExpired as err:
print("Timeout Expired")
proc.poll()
status == proc.returncode
except Exception as err:
print("Unhandled Ex")我希望看到的输出如下:
A
B
Timeout expired <-This after the sleep(5) call
C然而,我却得到了
Timeout expired
Timeout expired
Timeout expired
A
B
C换句话说。只有当程序终止时,.communicate才能工作。否则它就结束了
发布于 2019-04-02 01:17:33
将flush=True添加到print()调用
print("A", flush=True)
time.sleep(1)
print("B", flush=True)
time.sleep(5)
print("C", flush=True)
exit()这迫使print()刷新流。
当交互时,stdout和stderr流是行缓冲的.否则,它们就像普通的文本文件一样被块缓冲.可以使用-u命令行选项重写此值。
https://stackoverflow.com/questions/55465500
复制相似问题