python 上下文管理器换行问题

标签 python python-3.x contextmanager

使用 Python 的 contextmanager我想生成一个包装器来显示某个代码块的类似 Linux 的进度:

做某事...完成。 [42 毫秒]

这是有效的 - 有点:

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))

这个用法示例应该打印“Doing something...” 没有换行符,等一下,打印“done.[1000 ms]”包括一个换行并退出。

with msg("Doing something"):
    time.sleep(1)

但是,在运行代码段时,输出first 等待一秒钟,然后afterwards 打印整行。在第一个 print() 语句中删除 end='' 时,一切都按预期工作,但代价是输出丑陋。

为什么会这样,是否有意为之,如何避免这种行为?

(Linux Mint 17.1 上的 Python 3.4.0)

最佳答案

问题可能是由于 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 之前,您必须使用 stdoutflush 方法:

print(m + "... ", end='')
sys.stdout.flush()

关于python 上下文管理器换行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828495/

相关文章:

python - 发布API授权

python-3.x - Pycharm 将打印中的 kwargs 识别为错误(python3)

block 内的 python 异常处理

python - 在Python中获取无替换列表的组合

用于临时变量分配的 Python 上下文管理器

python - 是否可以访问封闭的上下文管理器?

Python MySQLdb "with"语法和 DictCursor

python - 遍历 django 模板中的字典

python - 使用归并排序的反转次数

python - Pandas 数据框行操作