Python 2.7 读取和打印在同一行上更新但仍在更新的进度条

Python 2.7 读取和打印在同一行上更新但仍在更新的进度条,python-2.7,cmd,progress-bar,subprocess,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:

因此,我使用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()一次读取每一行,它会打印关于检测和连接到设备的前两行,然后在10分钟内不显示任何内容,然后打印这一行:

[                  Writing   ] [############## 100 ##############]
因此,我在cmd窗口上的输出如下所示:

Connecting to Device:
Connected

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

Done.
所以它不是从[Writing 0]开始,然后[Writing 1]。。。。直到达到[100]。这是因为加载程序正在同一行上更新,所以proc.stdout.readline()会等待加载行完成,然后将其打印出来,这与让进度条每隔几秒钟显示一次进度的目的大相径庭


谁能帮我解决这个问题?我尝试同时打印到文件和cmd窗口以检查“Done.”字符串,但没有成功,因为它只将“0”打印到txt文件。

好的,因此我找到了解决此问题的答案:

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


问题是进度条行以“\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

为什么不干脆
stdout.read()
然后打印呢?要检查终止条件,请分别存储最后4个字符并查看它们是否等于“完成”。使用stdout.read()的RedX无法解决我仍然需要进度条在cmd窗口中显示和更新以及检查“完成”字符串的问题。如果你仍然认为这是可行的,请详细说明这一点
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