使用 \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 重定向到文件或管道以供以后处理,并在程序执行期间仍能看到状态信息。
我正在尝试打印状态更新(例如,我的程序所在的行号)以覆盖控制台输出同一行上的先前更新。大多数关于此的 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 重定向到文件或管道以供以后处理,并在程序执行期间仍能看到状态信息。