使用 Rich 计算球谐系数的 Python 嵌套进度条

问题描述 投票:0回答:1

我有一组用于球谐系数的嵌套 for 循环,我想使用 Rich 来显示嵌套组件的进度。

import numpy as np
from time import sleep

l = 32
for ll in np.arange(l):
    # I want a progress bar for ll here

    for mm in np.arange(-1*ll, ll+1):
        # I want a progress bar for mm here
        sleep(0.01)
        print(f"l: [{ll}], m: [{mm}]")

这个github问题提供了部分解决方案https://github.com/Textualize/rich/discussions/2272,但假设每个子循环具有相同数量的条目:

from rich.progress import Progress
from time import sleep

with Progress() as pb:
    t1 = pb.add_task('inner', total=10)
    t2 = pb.add_task('outer', total=100)

    for i in range(100):
        for j in range(10):
            print(f"Verbose info! {i, j}")
            sleep(0.1)
            pb.update(task_id=t1, completed=j + 1)
        pb.update(task_id=t2, completed=i + 1)

虽然我喜欢 tqdm,并且使用

leave=False
关键字取得了部分成功,但我对两个循环完成后丢失最后一个输出的方式不满意

import numpy as np
from tqdm import tqdm
from time import sleep

l = 32
for ll in tqdm(
    np.arange(l),
    desc=r"𝑙 ",
    disable=False,
):

    for mm in tqdm(
        np.arange(-1 * ll, ll + 1),
        leave=False,
        desc=r"𝑚 ",
        disable=False,
    ):
        sleep(0.01)

如有任何帮助,我们将不胜感激!

python progress-bar rich
1个回答
0
投票

如果我理解正确,您希望在运行时看到进度条,但您不关心程序完成后它们是否仍然存在?但您确实关心打印输出吗?

不幸的是,大多数进度条库在很好地或根本不使用进度条时不能处理任意打印到屏幕上。 Enlighten 是专门为此用例编写的。

下面的示例显式调用

close
stop
方法,但您也可以使用 上下文管理器 隐式执行此操作。您还可以调整
leave
的值以满足您的需要。 文档中描述了更多选项,例如颜色和自定义格式

from time import sleep

import enlighten
import numpy as np

manager = enlighten.get_manager()

l = 32
l_pbar = manager.counter(total=l, desc='l', leave=False)
for ll in np.arange(l):
    l_pbar.update()
    m_pbar = manager.counter(total=ll * 2 + 1, desc='m', leave=False)

    for mm in np.arange(-1*ll, ll+1):
        m_pbar.update()
        sleep(0.01)
        print(f"l: [{ll}], m: [{mm}]")

    m_pbar.close()
l_pbar.close()
manager.stop()
© www.soinside.com 2019 - 2024. All rights reserved.