首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python contextmanager换行符问题

python contextmanager换行符问题
EN

Stack Overflow用户
提问于 2015-06-14 10:53:17
回答 1查看 191关注 0票数 4

使用Python的联系人管理器,我希望生成一个包装器来显示特定代码块的类似Linux的进度:

Doing something... done. [42 ms]

这起作用了--有点像:

代码语言:javascript
复制
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”,包括换行和退出。

代码语言:javascript
复制
with msg("Doing something"):
    time.sleep(1)

但是,在运行代码段时,输出首先等待第二个,然后打印整行。当在第一个end=''语句中删除print()时,一切都像预期的那样工作,但代价是一个难看的输出。

为什么是这种情况,这是有意的,以及如何避免这种行为?

( Linux 17.1上的Python3.4.0)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-14 11:01:13

这个问题可能是由于stdout的缓冲。您需要手动刷新它才能显示消息。在Python 3.3+中,print函数有一个flush参数:

代码语言:javascript
复制
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

代码语言:javascript
复制
print(m + "... ", end='')
sys.stdout.flush()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30828495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档