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

vtwuwzda  于 12个月前  发布在  Go
关注(0)|答案(6)|浏览(196)

我正在使用tqdm来显示进度条,同时完成一些长时间运行的Django管理命令。它工作得很好(很容易使用!),但是...
当我对代码运行单元测试时,我希望停止输出进度条。如果我在后台使用cron或其他方法运行这些命令,我也希望进度条不出现在输出中。
我看不出一个简单的方法来做这两件事,但也许我错过了什么?

dpiehjr4

dpiehjr41#

使用“disable”参数的示例:

from tqdm import tqdm
import time

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

字符串

w6lpcovy

w6lpcovy2#

有一个disable参数,你可以设置为True来静音任何tqdm输出(事实上,它也会完全跳过进度条计算,而不仅仅是显示)。
要动态地切换它,你可以在脚本中添加一个命令行参数来定义是否设置了disable。这应该对单元测试和cron都有效。

mkshixfv

mkshixfv3#

当您需要全局禁用所有tqdm的输出时,这是一个非常常见的用例,最好不要在所有使用它的地方修改代码,而这些地方可能是您无法控制的。

4.66.0版本启动

设置环境变量TQDM_DISABLE=1。注意,变量的确切值并不重要,它应该是一个非空字符串。

旧版本

用户需要修补tqdm以停止污染日志。我发现的最短的方法之一可能是:

from tqdm import tqdm
from functools import partialmethod

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

字符串
我们的想法是默认初始化器已经支持的(但还不够)参数。这是不够的,因为你需要在每个示例化tqdm的地方添加它,这是你不想要的,这就是为什么我们修改__init__来设置这样一个默认值。
该补丁的工作顺序与导入顺序无关,并将影响随后创建的所有tqdm对象。

5jvtdoz2

5jvtdoz24#

在使用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):
    ...

3zwtqj6y

3zwtqj6y5#

version 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

字符串

li9yvcax

li9yvcax6#

模仿this answer(谢谢!),如果你也使用tqdm.write,这段代码应该也能抑制这些:

MODULE_TQDM = "tested_code_module.tqdm"

class NoTQDM:
    def __init__(self, iterable, *args, **kwargs):
        self.iterable = iterable

    def __iter__(self):
        for item in self.iterable:
            yield item

    def write(self, *args, **kwargs):
        pass

字符串
然后在测试中:

from unittest import mock

...

    @mock.patch(MODULE_TQDM, NoTQDM)
    def test_method(self):
    ...

相关问题