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

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

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

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

我看不到做这两件事的简单方法,但也许我错过了一些东西?

django cron tqdm
5个回答
79
投票

使用“disable”参数的示例:

from tqdm import tqdm
import time

for i in tqdm(range(10), disable=True):
    time.sleep(1)

62
投票

有一个

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

要动态切换它,您只需在脚本中添加一个命令行参数即可定义是否设置

disable
。这应该适用于单元测试和 cron。


57
投票

当您需要全局禁用所有

tqdm
时,这是非常常见的用例,最好不要更改所有使用它且您可能无法控制的地方的代码。关于实现此类功能的讨论持续了很多年,但毫无结果(1234)。用户需要修补 tqdm 以阻止污染日志。我发现的最短的方法之一可能是这样的:

from tqdm import tqdm
from functools import partialmethod

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

这个想法是默认初始化器已经支持(但不充分)的参数。这还不够,因为您需要在实例化 tqdm 的每个地方添加它,而您不希望这样做,这就是我们修改

__init__
以进行这样的默认设置的原因。

补丁的工作方式与导入顺序无关,并将影响所有随后创建的

tqdm
对象。


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):
    ...

0
投票

版本 4.66.0 起,可以使用带有 tqdm

 前缀后跟参数名称的环境变量来覆盖默认的 
TQDM_
 参数
。这意味着您可以在导入
tqdm
或任何使用它的模块之前,通过将
TQDM_DISABLE
环境变量设置为
1
来禁用
tqdm
的输出:

import os

os.environ["TQDM_DISABLE"] = "1"

# import tqdm and/or modules that use it here
© www.soinside.com 2019 - 2024. All rights reserved.