使用tee实时打印Python输出
我有一个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.