gpt4 book ai didi

python - subprocess.communicate 仅在退出时读取

转载 作者:行者123 更新时间:2023-12-01 08:07:37 25 4
gpt4 key购买 nike

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

但是,当尝试读取进程的标准输出时,communicate(timeout=2) 总是会遇到 TimeoutError,即使有效的标准输出数据应该可用。

代码在 Flask 应用程序中运行,在使用 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()刷新流。

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.

关于python - subprocess.communicate 仅在退出时读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55465500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com