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

但是,当尝试读取进程的标准输出时,即使应提供有效的标准输出数据,communicate(timeout=2)也会始终遇到TimeoutError。

该代码在带有daemon=True的线程的flask应用程序中运行。

我正在尝试运行的过程是

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()冲洗流。


  When interactive, stdout and stderr streams are line-buffered. Otherwise, they are block-buffered like regular text files. You can override this value with the -u command-line option.

10-08 08:13