Python实时打印函数

12

我最近更换了操作系统,现在使用更新的 Python (2.7)。 在我的旧系统上,我能够立即打印输出。 例如,假设我有一个计算密集型的 for 循环:

for i in range(10):
  huge calculation
  print i

当代码完成每次迭代时,它将打印 i

然而,在我的当前系统上,Python似乎会缓存stdout,导致终端在数分钟内为空白,之后才会打印:

1
2
3

短时间内快速打印输出。然后,几分钟后,它会打印:

4
5
6

以此类推。如何让Python在达到print语句时立即打印?

3个回答

15
尝试在打印后调用stdout的flush方法。
import sys

...
sys.stdout.flush()

或者使用命令行选项-u,它:

强制使标准输入、输出和错误流完全无缓冲。


谢谢!这个可以用,但您知道怎样可以自动设置它吗? - Rishi
2
@Rishi:如果不想编译自己的Python版本,最接近自动化的方法就是设置PYTHONUNBUFFERED环境变量。 - Jeff Mercado
Jeff的评论对我非常有帮助。谢谢。 - Rishi

14
自Python 3.3起,您可以简单地将flush=True传递给print函数。

4

导入新的print-as-function,就像在Python 3.x中一样:

from __future__ import print_function

(将以下语句放在你的脚本/模块顶部)

这可以让你替换新的打印函数为自己定义的函数:

def print(s, end='\n', file=sys.stdout):
    file.write(s + end)
    file.flush()

优点是这样,当你有一天升级到Python 3.x的时候,你的脚本仍然可以正常工作。
Ps1: 我没有试过,但是print-as-function可能会默认刷新。
PS2: 你可能也会对我进度条示例感兴趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接