Python - 跨越多个脚本的 tqdm 嵌套循环



正如描述中提到的,我有两个脚本以下列方式工作:

  1. Script1.py 有一个嵌套循环,即两个循环都附有 tqdm 装饰器
  2. Script2.py 是一个多进程脚本,它调用要处理 script1.py 的列表和函数 在 pool.map 函数中。此脚本除了添加多处理外,不执行任何新操作。

我以这种方式创建了这些脚本,以便它们是模块化的。当 script1.py 被单独调用时,输出循环 1loop2中将有两个进度条,效果很好。但是,当 script2.py 被称为时,我的想法是我在这里想要相同的内容,但调整了 script2 中的多处理函数中的loop1将 script1.py 中的loop1 替换为 loop1(它们应该是等效的(。

现在,它有点工作了一半。正在发生的事情是两个进度条在命令行输出中共享相同的空间/行。因此,在这一点上,如果我想使用多处理,我必须在 loop1 和 loop2 之间进行选择。实际上两者都可以打开,但 loop1 偶尔会闪过。很抱歉没有提供代码,因为它会很复杂。我已经多次查阅了 tqdm 文档,但无法理解它。我尝试了position选项,但这只会使进度条跳到处都是,尽管循环leave=false。不确定我是否通过模块化和多处理使自己变得更糟。我可以将 script2.py 的内容移动到 script1.py 并完成它,但我正在评估我的项目的并行化。 有没有办法让两个进度条相互"知道",以便它们停止使用彼此的空间?没有看到其他人有这种问题,也许我以一种奇怪的方式做?

我不确定这是否能解决你的问题,但它可能有助于理解position问题:

from tqdm import trange
from time import sleep
lv = False
num0, num1 = 0, 1
for i in trange(2, desc='loop0', position = num0):
for j in trange(4, desc='loop1', leave=lv, position=num1):
#print(j);  #num1 -= 1
for k in trange(100, desc='loop2', leave=lv, position=2):
#num+=1
sleep(0.01)

如果您通过笔记本运行脚本,它确实会跳转。可能是因为它不支持更改光标位置。脚本在终端中的工作方式与此图像类似。

更新:alive_progress似乎没有太大问题,您也可以尝试

from alive_progress import alive_bar
import time
with alive_bar(9) as bar:
for i in range(9):
bar()
time.sleep(0.01)
with alive_bar(9) as bar2:
for j in range(9):
bar2()
print(j)

最新更新