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

时间:2015-03-20 21:44:52

标签: python macos terminal

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

import sys
import time

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

我期待它做的是在同一行上每半秒打印一颗星(这正是我使用像Sublime Text这样的IDE运行代码时的功能)。但是,当我在Mac OS终端中运行它时,它只等待5秒钟,然后立即打印整个字符串**********

为什么会发生这种情况以及如何获得理想的行为?

2 个答案:

答案 0 :(得分:3)

这样做是因为输出是缓冲的。试试这个:

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不会等到下一个换行符;相反,它会立即写入缓冲区中的任何字符。

答案 1 :(得分:3)

输出正在缓冲,因此您需要在每次写入操作后调用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()

如果你碰巧使用Python 2.x,你还需要写:

from __future__ import print_function

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