Python sys.stdout.write() Mac 终端中的奇怪行为

Python sys.stdout.write() strange behavior in Mac terminal

我正在尝试为流程制作进度条,但为了简短起见,请考虑以下代码段:

import sys
import time

for i in range(10):
  time.sleep(0.5)
  sys.stdout.write('*')
sys.stdout.write('\n')

我期望它做的是在同一行上每半秒打印一个星星(这正是我 运行 带有像 Sublime 这样的 IDE 的代码时它所做的例如文本)。但是,当我在 Mac OS 终端中 运行 时,它只等待 5 秒,然后立即打印整个字符串 **********

知道为什么会发生这种情况以及如何获得所需的行为吗?

它这样做是因为输出被缓冲了。试试这个:

import sys
import time

for i in range(10):
    time.sleep(0.5)
    sys.stdout.write('*')
    sys.stdout.flush()    # <-- this is the key
sys.stdout.write('\n')

通过每次写入时刷新输出,sys.stdout 不会等待下一个换行符;相反,它会立即写入其缓冲区中的任何字符。

正在缓冲输出,因此您需要在每次写入操作后调用 sys.stdout.flush() 来刷新缓冲区。

或者,更好的是,只需使用 print 并让 Python 为您完成。在 3.3+ 版本中,代码为:

import time

for i in range(10):
  time.sleep(0.5)
  print('*', end='', flush=True)
print()

如果您使用的是旧版本,则可以省略 flush=True:

import time

for i in range(10):
  time.sleep(0.5)
  print('*', end='')
print()

如果你恰好使用Python2.x,你还需要写:

from __future__ import print_function

在您的代码顶部使用 Python 3.x print。有关详细信息,请参阅文档中的 __future__ — Future statement definitions