导入NumPy缓冲区重定向stdout时打印

2eafrhcq  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(76)

为了澄清这一点,只有当将stdout定向到文件时,直接打印到终端才能正常工作。另外,我在Mac上,所以没有stdbuf之类的。
我有一个非常简单的文件test.py

import time
print("start", flush=True)
time.sleep(1)
print("end")

我用python3 test.py > test.txt调用它。这工作很好,start显示,然后是end后1秒的延迟。现在我想导入NumPy:

import time
import numpy # <-
print("start", flush=True)
time.sleep(1)
print("end")

再运行一次。..现在,在1秒延迟之后,startend同时出现。
在这一点上,我尝试了所有我能想象的事情:
1.这里的一切:Disable output buffering
1.使用out = file("test.txt", "w"); out.write("start\n")
1.打印到终端并使用python3 test.py 2>&1 | tee /tmp/ls.txt定向到文件
编辑:我应该补充一点,用CTRL-C中断程序确实会使start出现。

ep6jt1vc

ep6jt1vc1#

我能够复制这个。正如评论中指出的,这不是一个麻木或缓冲问题。这可能是VSCode的自动更新行为。
试试这个代码。

import time

started = time.perf_counter()
for i in range(20):
    print(f"{i}: {time.perf_counter() - started:.2f}", flush=True)
    time.sleep(0.1)

在我的电脑上,0和1立即显示,然后缓冲启动。此外,改变睡眠时间(例如0.08)改变这种行为。
我找不到这个规范的文档,但我假设VSCode会根据输出前几百毫秒的内容自动更改缓冲设置。简而言之,如果这种行为困扰您,您应该寻找另一个查看器或创建自己的查看器。

相关问题