我正在尝试将进度条添加到我的安装脚本中。我尝试使用模块进度条但它取决于范围而我没有这个数字,我想要安装的每个文件都需要不同的时间。 我有一个我要安装的文件列表,我想通过进度条监视它。 这是流程线:
p2 = subprocess.Popen(["dpkg", "--force-all", "-i", "-R", pwd.strip() + "/archives"], stdout=out, stderr=err)
我想过使用输出文件,但它动态增长,我没有成功监控它。 out文件的一个示例:
在文件的开头,有一行" Unpacking" "准备"对于每个包裹:
Unpacking openvswitch-switch (2.0.2-0ubuntu0.14.04.2) over (2.0.2-0ubuntu0.14.04.2) ...
Preparing to unpack .../libllvm3.6_3.6-2ubuntu1_amd64.deb ...
Unpacking libllvm3.6:amd64 (1:3.6-2ubuntu1) over (1:3.6-2ubuntu1) ...
Preparing to unpack .../kpartx_0.4.9-3ubuntu7.4_amd64.deb ...
Unpacking kpartx (0.4.9-3ubuntu7.4) over (0.4.9-3ubuntu7.4) ...
.
.
.
之后有一些"设置"有时会启动包的过程,如下所示:
Setting up openvswitch-switch (2.0.2-0ubuntu0.14.04.2) ...
openvswitch-switch stop/waiting
openvswitch-switch start/running
Setting up libllvm3.6:amd64 (1:3.6-2ubuntu1) ...
Setting up libxen-4.4 (4.4.2-0ubuntu0.14.04.1) ...
Setting up sg3-utils (1.36-1ubuntu1) ...
.
.
.
我有294个文件以及包含'拆包' 294,'准备' 294和'设置' 293和总行数是915。
任何人都知道如何做到这一点?
答案 0 :(得分:1)
没有for
循环,递归或其他一些方法,你可以在你发布的代码中插入进度更新功能,所以除非你可以展开它,否则你真的没有运气。我做进度条的典型方法是:
niter = 10000
# Setup the progress counters
increment = int(0.01 * niter)
percent = 0
countdown = increment
nbars = 0
totalbars = 20
barincrement = int(100/totalbars)
sys.stdout.write("{0}0%\r".format(" " * totalbars))
for i in range(niter):
doSomeWork()
countdown -= 1
# Update and print out progress bar and % indicator if required
if countdown == 0:
percent += 1
countdown = increment
if percent % barcinrement == 0:
nbars += 1
bars = "#" * nbars
space = " " * (totalbars - nbars)
sys.stdout.write("{0}{1}{2}%\r".format(bars, space, percent))
sys.stdout.write("\nOperation Complete!\n")
我经常会移动设置&将进度条更新为单独的类以使实际逻辑更具可读性,以便您具有以下内容:
niter = 10000
prog = ProgressReporter(niter)
for i in range(niter):
doSomeWork()
prog.update()
prog.finish()
要打印进度条,您需要某种迭代程序来实际更新进度。
在您的情况下,您可能需要自己实现它,而不是进行子进程调用。或者也许为每个文件单独调用。但无论哪种方式 - 没有迭代形式,没有进度条。