Python 2.7 读取和打印在同一行上更新但仍在更新的进度条
因此,我使用subprocess.Popen将新操作系统加载到多个设备上 我的剧本: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:
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