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。
我正在尝试为流程制作进度条,但为了简短起见,请考虑以下代码段:
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。