读取和打印正在更新时在同一行上更新的进度条

时间:2014-06-10 15:22:46

标签: python-2.7 cmd progress-bar subprocess

所以我使用subprocess.Popen将新操作系统加载到多个设备上。

我的剧本:

done = None
command = 'my loading command'
proc = subprocess.Popen(command, stdout=subprocess.PIPE)

while proc.poll() is None:
    line = proc.stdout.readline()
    print line.strip()
    if "Done" in line:
        done = True

因此,加载过程应该从检测到插入系统的设备开始,然后启动加载器/进度条:

Connecting to Device:
Connected

[                  Writing   ] [               0                 ]
[                  Writing   ] [               1                 ]
[                  Writing   ] [               2                 ]
.
.
.
.
[                  Writing   ] [############## 100 ##############]


Done.

现在为了确保加载完成,我使用带有stdout = PIPE的Popen来检查" Done。"将字符串打印到stdout,然后将stdout打印到cmd窗口。现在我的问题是,因为proc.stdout.readline()一次读取每一行,它打印关于检测和连接到设备的前2行,然后10分钟没有打印,然后它打印这一行:

[                  Writing   ] [############## 100 ##############]

因此我在cmd窗口上的输出如下所示:

Connecting to Device:
Connected

[                  Writing   ] [############## 100 ##############]

Done.

所以它不是从[Wrtiting 0]开始,然后是[写1] ....直到它达到[100]。这是因为加载器正在同一行更新,所以proc.stdout.readline()等到加载行完成然后将其打印出来,这几乎违背了进度条显示每个coupe的进度的目的几秒钟。

任何人都可以帮我解决这个问题吗?我同时尝试打印到文件和cmd窗口以检查"完成。"字符串,但没有运气,因为它只打印' 0'到txt文件。

2 个答案:

答案 0 :(得分:0)

好吧所以我找到了解决这个问题的答案:

为了能够检查完成的字符串并打印进度条,因为它进展到100%我使用相同的代码,除了我必须指定readline()中的字符数。所以我做了加载并将其打印到文件然后复制了进度条已满的最后一行,将其输入到打印len(str)中,得到了字符串的长度,然后将其作为参数添加到readline()命令:

done = None
command = 'my loading command'
proc = subprocess.Popen(command, stdout=subprocess.PIPE)

while proc.poll() is None:
    line = proc.stdout.readline(77)
    print line.strip()
    if "Done" in line:
        done = True

答案 1 :(得分:0)

问题在于进度条行以 '\r' 而不是 '\n' 结尾。如果您将代码更改为以下内容,它应该可以工作:

done = None
command = 'my loading command'
proc = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True)

while proc.poll() is None:
    line = proc.stdout.readline()
    print line.strip()
    if "Done" in line:
        done = True