使用tee实时打印Python输出

29 投票
1 回答
14069 浏览
提问于 2025-04-26 12:20

我有一个Python脚本,内容大概是这样的:

for item in collection:
    print "what up"
    #do complicated stuff that takes a long time.

在bash中,我通过以下方式运行这个脚本:

$ python my.py | tee my_file.txt

不过,在bash中我看到的只是一个空白行,直到程序运行结束。然后,所有的打印信息才会一次性显示出来。

这是tee的正常工作方式吗?我能不能用tee实时查看输出?

暂无标签

1 个回答

48

Python和很多程序一样,尽量减少调用write这个系统命令的次数。它通过在真正写入输出文件之前,先把多个print语句的输出收集起来,这个过程叫做“输出缓冲”。

当Python连接到终端时,它不会进行输出缓冲。这是有道理的,因为在终端前的人希望能立刻看到输出结果。

而当Python写入文件(或者管道)时,它会进行输出缓冲。这同样合理,因为在处理完成之前,没有人能看到输出。

如果你想强制Python立即将缓冲的输出写入标准输出文件,可以调用sys.stdout.flush()

在你的情况下,可以尝试这样做:

import sys
...
for item in collection:
    print "what up"
    sys.stdout.flush()
    #do complicated stuff that takes a long time.

撰写回答