47

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

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

我看不到做这两件事的简单方法,但也许我错过了什么?

4

4 回答 4

47

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

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

于 2016-05-15T01:44:40.973 回答
41

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

from tqdm import tqdm
import time

for i in tqdm(range(10), disable=True):
    time.sleep(1)
于 2020-04-08T20:13:05.750 回答
25

当您需要全局禁用 all 时,这是非常常见的用例tqdm,最好不要更改所有使用它的地方的代码并且您可能无法控制。关于实现这样一个特性的讨论持续了很多年,但一无所获(1 , 2 , 3 , 4)。用户需要修补 tqdm 以停止污染日志。我发现的最短方法之一可能是:

from tqdm import tqdm
from functools import partialmethod

tqdm.__init__ = partialmethod(tqdm.__init__, disable=True)

这个想法是默认初始化程序已经支持(但不够)的参数。这还不够,因为您需要在每个实例化 tqdm 的地方添加它,这是您不想要的,这就是我们修改__init__以使其成为默认值的原因。

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

于 2021-04-24T01:12:20.793 回答
9

使用以下代码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

并在测试中:

import mock

...

    @mock.patch('tested_code_module.tqdm', notqdm)
    def test_method(self):
    ...
于 2017-10-11T13:28:47.507 回答