我想使用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 如果在一个地方回答,我会用