在运行测试或通过cron运行代码时使tqdm的输出静音

Phi*_*ord 5 django cron tqdm

我正在使用tqdm显示进度条,同时完成了一些长期运行的Django管理命令。它很好用(很容易使用!),但是...

当我对代码运行单元测试时,我想停止输出进度条。而且,如果我使用cron或其他某种方式在后台运行这些命令,我​​也希望进度条不在输出中。

我看不到做这两种事情的简便方法,但是也许我错过了什么?

can*_*nin 21

使用“禁用”参数的示例:

from tqdm import tqdm
import time

for i in tqdm(range(10), disable=True):
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的答案,截至 2021 年 1 月,效果非常好。 (2认同)

gab*_*ous 9

disable您可以设置一个参数True以使任何tqdm输出静音(实际上,它也将完全跳过进度条计算,而不仅仅是显示)。

要动态切换它,您只需在脚本中添加命令行参数即可定义是否disable设置。这对于单元测试和cron应该都适用。


小智 8

用于在使用它的代码中mock.patch替换tqdm如下内容:

def notqdm(iterable, *args, **kwargs):
    """
    replacement for tqdm that just passes back the iterable
    useful to silence `tqdm` in tests
    """
    return iterable
Run Code Online (Sandbox Code Playgroud)

并在测试中:

import mock

...

    @mock.patch('tested_code_module.tqdm', notqdm)
    def test_method(self):
    ...
Run Code Online (Sandbox Code Playgroud)


gre*_*van 8

当您需要全局禁用 all 时,这是非常常见的用例tqdm,最好不要更改所有使用它且您可能无法控制的地方的代码。有关实现这样的功能,过去多年,导致没有(讨论1234)。用户需要修补 tqdm 以停止污染日志。我发现的最短方法之一可能是这样的:

from tqdm import tqdm
from functools import partialmethod

tqdm.__init__ = partialmethod(tqdm.__init__, disable=True)
Run Code Online (Sandbox Code Playgroud)

这个想法是默认初始化器的已经支持(但不够)的参数。这还不够,因为您需要在实例化 tqdm 的每个地方添加它,这是您不想要的。

该补丁独立于导入的顺序工作,并将影响所有随后创建的tqdm对象。

  • 我刚刚尝试过这个,它可以使用 tqdm 处理导入的包,而无需触摸或重写代码。 (2认同)