我有一个类似于这样的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.
-u
标志来调用脚本也可以解决你的问题,例如 python -u my.py | tee my_file.txt
。请注意,我的翻译尽可能保持原意,同时使之更通俗易懂,但不包括任何额外信息或解释。 - BiBi
import sys
",并在缩进的下一行中添加打印语句 "sys.stdout.flush()
"。 - Anthon