子进程.通信仅在退出时读取



我正在尝试在线程中运行一个子进程,该子进程将定期输出数据(但每秒多次(

但是,当尝试读取进程的 stdout 时,communicate(timeout=2)总是遇到超时错误,即使有效的 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仅在程序终止时有效。否则它就会结束

flush=True添加到print()调用

print("A", flush=True)
time.sleep(1)
print("B", flush=True)
time.sleep(5)
print("C", flush=True)
exit()

此力print()冲洗流。

交互时,标准输出和标准流是行缓冲的。否则,它们像常规文本文件一样进行块缓冲。可以使用 -u 命令行选项覆盖此值。

最新更新