当前位置: 首页 > 面试题库 >

python contextmanager换行问题

龙成仁
2023-03-14
问题内容

我想使用Python的contextmanager生成一个包装器,以显示特定代码块的类似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 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之前,您必须使用以下flush方法stdout

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


 类似资料:
  • 不知何故,当我使用时,弹出窗口中没有新行 请参阅下面的代码示例。

  • 每一个通用的版本控制系统,无论是CVS、Subversion、Git或是其他,都要面对换行符转换的问题。这是因为作为通用的版本控制系统要面对来自不同操作系统的文件,而不同的操作系统在处理文本文件时,可能使用不同的换行符。 不同的操作系统可能使用不同的换行符 文本文件的每一行结尾用一个或者两个特殊的ASCII字符进行标识,这个标识就是换行符。主要的换行符有三种:LF(Line Feed即换行,C语言

  • GNU/Linux和Mac OS使用换行()或新行作为行结束字符,而Windows使用换行和回车()组合来表示行结束字符。 为了避免这些行结尾的差异的不必要提交,我们必须配置Git客户端写入与Git仓库使用相同的行结束符。 对于Windows系统,可以将Git客户端配置为将行结束符转换为格式,同时退出,并在提交操作时将其转换回格式。以下可根据您的需要来设置。 对于GNU/Linux或Mac OS,

  • 我使用Saxon HE9.5作为XSLT处理器。由于源是一个大尺寸的XML,我需要最小化输出的大小。但是,使用Saxon他将在每个元素标记之间添加换行符。如下面的示例:

  • 我被这个问题困了2天。我只想提取图像中标记的数据,以便通过XSLT进行转换。我在这个问题中也给出了XML文件。抱歉,如果这是一个非常愚蠢的问题。类似的路径,如//partyinformation/buyer/contact//name在文档中工作。但是//partyinformation/买主/联系人//姓名不起作用 到目前为止我已经试过了, //partyinformation/buyer/co

  • Docx4j版本2.8.1.3 docx非常简单,只有一些文本,但似乎对任何docx都不适用。 在docx4j论坛上查看源/异常可能更容易。http://www.docx4java.org/forums/pdf-output-f27/docx4j-to-pdf-fop-issues-cannot-perform-the-transformation-t1652.html 如果在一个地方回答,我会用