使用tee从python获取实时打印语句

rob*_*ert 16 python stdout tee

我有一个python脚本,看起来像这样:

for item in collection:
    print "what up"
    #do complicated stuff that takes a long time.
Run Code Online (Sandbox Code Playgroud)

在bash中,我通过执行以下操作来运行此脚本:

$ python my.py | tee my_file.txt
Run Code Online (Sandbox Code Playgroud)

但是,我在bash中看到的只是一个空行,直到程序结束.然后,所有的打印语句都在一个.

这是发球台的预期操作吗?我可以使用T恤实时查看输出吗?

Rob*_*obᵩ 25

与许多程序一样,Python试图最小化它调用write系统调用的次数.它通过print在实际将它们写入标准输出文件之前收集几个语句的输出来完成此操作.此过程称为缓冲输出.

当Python连接到终端时,它不会缓冲其输出.这是有道理的,因为终端的人想要立即看到输出.

当Python写入文件(或管道)时,它会缓冲其输出.这也是有道理的,因为在该过程完成之前,没有人会看到输出

sys.stdout.flush()每当您想强制Python将其缓冲输出写入其标准输出文件时,您都可以通过调用来取消此优化.

在你的情况下,试试这个:

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

  • 很棒的解释!我想补充说,使用标志`-u`调用脚本也可以解决你的问题,例如`python -u my.py | tee my_file.txt` (18认同)