使用 \r 覆盖 Python 中的前一行不适用于 Linux

Overwriting previous line in Python using \r not working on Linux

我正在尝试打印状态更新(例如,我的程序所在的行号)以覆盖控制台输出同一行上的先前更新。大多数关于此的 Stack Overflow 回答建议使用“\r”。以下代码在我的 Windows 计算机上运行良好:

import time
for i in range(10):
    print str(i) + '\r' ,
    time.sleep(1)

但是当我将它移动到 Google Compute Engine 机器(Debian GNU/Linux 7.8 (wheezy))时,同样的代码不会显示任何输出。有什么想法吗?

可能一个缓冲问题 -- 讨论如下。

缓冲区刷新的工作方式因附加的文件或管道类型而异。这是为了支持及时向人们展示他需要看到的内容,同时通过在适当的地方进行批处理来更有效地处理文件操作。但有时算法会出错;幸运的是,当发生这种情况时,有工具可以手动冲洗:

from sys import stdout

import time
for i in range(10):
    print str(i) + '\r' ,
    stdout.flush()
    time.sleep(1)

顺便说一句,我个人觉得当光标在我的字符串顶部时很烦人,所以如果我做这样的事情,我通常会从 space:

开始
    print ' %s\r' % i,

或者,由于您需要导入 sys 并且无论如何都有 stdout 可用,您可以在打印后省去有趣的逗号,只需执行以下操作:

    stdout.write(' %s\r' % i)

这里讨论了更多关于 stdin、stdout 和 stderr 缓冲的信息:

Is stdout line buffered, unbuffered or indeterminate by default?

请注意,stderr 通常不会被缓冲,因此通常不会出现此问题。将状态信息定向到 stderr 并将实际输出定向到 stdout 是一个很好的方式,对于简单的程序来说也可以吃蛋糕 - 您可以在屏幕上查看所有内容,或者您​​可以将 stdout 重定向到文件或管道以供以后处理,并在程序执行期间仍能看到状态信息。