使用Python的联系人管理器,我希望生成一个包装器来显示特定代码块的类似Linux的进度:
Doing something... done. [42 ms]
这起作用了--有点像:
from contextlib import contextmanager
import time
@contextmanager
def msg(m):
print(m + "... ", end='')
t_start = time.time()
yield
t_duration_ms = 1000 * (time.time() - t_start)
print("done. [{:.0f} ms]".format(t_duration_ms))这个用法示例应该打印“做某事.”如果没有行中断,请稍等片刻,打印“已完成. 1000 ms”,包括换行和退出。
with msg("Doing something"):
time.sleep(1)但是,在运行代码段时,输出首先等待第二个,然后打印整行。当在第一个end=''语句中删除print()时,一切都像预期的那样工作,但代价是一个难看的输出。
为什么是这种情况,这是有意的,以及如何避免这种行为?
( Linux 17.1上的Python3.4.0)
发布于 2015-06-14 11:01:13
这个问题可能是由于stdout的缓冲。您需要手动刷新它才能显示消息。在Python 3.3+中,print函数有一个flush参数:
from contextlib import contextmanager
import time
@contextmanager
def msg(m):
print(m + "... ", end='', flush=True)
t_start = time.time()
yield
t_duration_ms = 1000 * (time.time() - t_start)
print("done. [{:.0f} ms]".format(t_duration_ms))在3.3之前,您必须使用flush方法的stdout
print(m + "... ", end='')
sys.stdout.flush()https://stackoverflow.com/questions/30828495
复制相似问题