如何在python

时间:2015-11-05 09:21:44

标签: python

我正在尝试将进度条添加到我的安装脚本中。我尝试使用模块进度条但它取决于范围而我没有这个数字,我想要安装的每个文件都需要不同的时间。 我有一个我要安装的文件列表,我想通过进度条监视它。 这是流程线:

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。

任何人都知道如何做到这一点?

1 个答案:

答案 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()

要打印进度条,您需要某种迭代程序来实际更新进度。

在您的情况下,您可能需要自己实现它,而不是进行子进程调用。或者也许为每个文件单独调用。但无论哪种方式 - 没有迭代形式,没有进度条。