【发布时间】:2021-11-18 23:58:22
【问题描述】:
我正在尝试使用进度条来减少使用 python subprocess 时运行 FPGA 构建脚本的冗长性。构建脚本可能需要几个小时才能运行,并且构建输出非常冗长。目前,我打印脚本的输出以供用户查看正在取得的进展,并了解进展情况。我想为用户清理它,因为冗长掩盖了重要的 python 日志,这真的很烦人。
本质上,我希望使用tqdm 来表示进度。我想要的是这个(它不必完全匹配下面的例子):
- 第一行显示进度指示器,即使进度没有增加,经过的时间仍应更新。理想情况下,这将是一个类似于纺车的进度指示器,但我可以制作一个带步骤的进度条
- 第二行本质上将构建输出显示为进度通知。这应该与构建的输出同步。我希望它在
subprocess.Popen完成后消失,但这不是必需的
构建开始时,终端可能如下所示:
INFO: starting build
Running Build [ ] (0:00:01.2345)
@I: compiling file <x>
完成后,它看起来像这样(注意终端输出行不见了)
INFO: starting build
Running Build [...........................] (6:25:48.6251)
<python continues logging stuff here>
为了确定进度,我将检查subprocess.Popen.stdout 以确定它是否是构建脚本中的一行。这是一些伪代码来显示我正在尝试做的事情:
from subprocess import Popen, PIPE
pb = <initialize progress bar>
lines_in_build_script = [
"step 1",
"step 2",
]
p = Popen(cmd, shell=True, stdout=PIPE)
for line in p.stdout:
pb.update_build_output(line)
if line in lines_in_build_script:
pb.increment_progress() # I would prefer if it was just a spinning wheel because looking for line in output is asking for trouble
rc = p.wait()
编辑:tqdm 不是必需的,这只是我知道的一个包。我愿意接受有关如何解决此问题的任何建议。
【问题讨论】:
-
无法写出完整的答案,但如果您想使用
tqdm,我认为tqdm doc 可能对您想要实现的目标有有用的答案;特别检查tqdm.write()函数,它可以让您在不重叠进度条的情况下将信息写入标准输出。此外,如果您想打印这种“复杂”的输出,tqdm.external_write_mode()上下文可能很有用。它会暂停进度条,但您只能在更新信息的短时间内暂停它。您可能也想使用回车 (\r)。 -
看起来很复杂(但也许可能,我不知道)是在进度条的上方和下方显示信息。以上所有信息可能会更容易。
-
太棒了,感谢您的建议。我试过了,对终端的外观不太满意。我尝试了几个不同的软件包并登陆了 yaspin。为进度微调器创建自己的格式化程序很简单。
标签: python progress-bar tqdm