我有一个看起来像这样的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 实时查看输出吗?
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.