我正在使用tqdm来显示进度条,同时完成一些长时间运行的Django管理命令。它工作得很好(很容易使用!),但是...当我对代码运行单元测试时,我希望停止输出进度条。如果我在后台使用cron或其他方法运行这些命令,我也希望进度条不出现在输出中。我看不出一个简单的方法来做这两件事,但也许我错过了什么?
dpiehjr41#
使用“disable”参数的示例:
from tqdm import tqdm import time for i in tqdm(range(10), disable=True): time.sleep(1)
字符串
w6lpcovy2#
有一个disable参数,你可以设置为True来静音任何tqdm输出(事实上,它也会完全跳过进度条计算,而不仅仅是显示)。要动态地切换它,你可以在脚本中添加一个命令行参数来定义是否设置了disable。这应该对单元测试和cron都有效。
disable
True
tqdm
mkshixfv3#
当您需要全局禁用所有tqdm的输出时,这是一个非常常见的用例,最好不要在所有使用它的地方修改代码,而这些地方可能是您无法控制的。
设置环境变量TQDM_DISABLE=1。注意,变量的确切值并不重要,它应该是一个非空字符串。
TQDM_DISABLE=1
用户需要修补tqdm以停止污染日志。我发现的最短的方法之一可能是:
from tqdm import tqdm from functools import partialmethod tqdm.__init__ = partialmethod(tqdm.__init__, disable=True)
字符串我们的想法是默认初始化器已经支持的(但还不够)参数。这是不够的,因为你需要在每个示例化tqdm的地方添加它,这是你不想要的,这就是为什么我们修改__init__来设置这样一个默认值。该补丁的工作顺序与导入顺序无关,并将影响随后创建的所有tqdm对象。
__init__
5jvtdoz24#
在使用mock.patch的代码中,使用tqdm替换它,如下所示:
mock.patch
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): ...
型
3zwtqj6y5#
从version 4.66.0开始,默认的tqdm参数可以使用带有TQDM_-前缀和参数名的环境变量来覆盖。这意味着在导入tqdm或任何使用它的模块之前,可以通过将TQDM_DISABLE环境变量设置为1来禁用tqdm的输出:
TQDM_
TQDM_DISABLE
1
import os os.environ["TQDM_DISABLE"] = "1" # import tqdm and/or modules that use it here
li9yvcax6#
模仿this answer(谢谢!),如果你也使用tqdm.write,这段代码应该也能抑制这些:
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): ...
6条答案
按热度按时间dpiehjr41#
使用“disable”参数的示例:
字符串
w6lpcovy2#
有一个
disable
参数,你可以设置为True
来静音任何tqdm
输出(事实上,它也会完全跳过进度条计算,而不仅仅是显示)。要动态地切换它,你可以在脚本中添加一个命令行参数来定义是否设置了
disable
。这应该对单元测试和cron都有效。mkshixfv3#
当您需要全局禁用所有
tqdm
的输出时,这是一个非常常见的用例,最好不要在所有使用它的地方修改代码,而这些地方可能是您无法控制的。4.66.0版本启动
设置环境变量
TQDM_DISABLE=1
。注意,变量的确切值并不重要,它应该是一个非空字符串。旧版本
用户需要修补tqdm以停止污染日志。我发现的最短的方法之一可能是:
字符串
我们的想法是默认初始化器已经支持的(但还不够)参数。这是不够的,因为你需要在每个示例化tqdm的地方添加它,这是你不想要的,这就是为什么我们修改
__init__
来设置这样一个默认值。该补丁的工作顺序与导入顺序无关,并将影响随后创建的所有
tqdm
对象。5jvtdoz24#
在使用
mock.patch
的代码中,使用tqdm
替换它,如下所示:字符串
在测试中:
型
3zwtqj6y5#
从version 4.66.0开始,默认的
tqdm
参数可以使用带有TQDM_
-前缀和参数名的环境变量来覆盖。这意味着在导入tqdm
或任何使用它的模块之前,可以通过将TQDM_DISABLE
环境变量设置为1
来禁用tqdm
的输出:字符串
li9yvcax6#
模仿this answer(谢谢!),如果你也使用
tqdm.write
,这段代码应该也能抑制这些:字符串
然后在测试中:
型