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

时间:2016-05-07 17:35:58

标签: django cron tqdm

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

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

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

4 个答案:

答案 0 :(得分:6)

有一个 function Person(job, married) { var employ = job; var status = married; } var ray = new Person("student", true); console.log(ray); 参数可以设置为disable以使任何True输出静音(实际上它也会完全跳过进度条计算,而不仅仅是显示)

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

答案 1 :(得分:3)

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

from tqdm import tqdm
from functools import partialmethod

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

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

补丁的工作与导入顺序无关,并将影响所有随后创建的 tqdm 对象。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

from tqdm import tqdm
import time

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