如何忽略根警告?

How to ignore root warnings?

我生成单色图像并使用 imageio.imwrite 保存它们。每次我保存文件时都会收到以下警告:

WARNING:root:Lossy conversion from float64 to uint8. Range [-0.24890179009891278, 2.35786261304524]. Convert image to uint8 prior to saving to suppress this warning.

我不关心这个 "lossy conversion"。一切看起来都很好并且工作正常。

但是,每生成约 100 张图像,我都会收到不同的警告,我想捕捉这些警告。所以我想忽略上面那个。

我试图忽略它,但即使我调用

import warnings
warnings.simplefilter('ignore')

之前我仍然收到此警告。

库不使用 warnings 模块。相反,它使用 logging framework, by calling the top-level logging.warning() function. See the imageio.core.util._precision_warn() function:

记录一条消息
from logging import warning as warn

# ...

def _precision_warn(p1, p2, extra=""):
    t = (
        "Lossy conversion from {} to {}. {} Convert image to {} prior to "
        "saving to suppress this warning."
    )
    warn(t.format(p1, p2, extra, p2))

这……很不幸,因为您无法使用 logging API 轻松禁用它。最佳做法是为库使用专用的命名记录器。

因此,最好修补库,不要让上面的函数成为空操作:

import imageio.core.util

def silence_imageio_warning(*args, **kwargs):
    pass

imageio.core.util._precision_warn = silence_imageio_warning

您还可以静音所有日志记录,调整根记录器的配置。这并不理想,因为您可能希望自己使用日志记录或使用性能更好的第三方库。

filed an issue with the project 要求他们修复他们的日志故事。

对此有一个简单的 workaround/solution。该库使用 logging 模块而不是 warning 模块。可以在代码中包含这些行以抑制任何此类根警告,除非它的严重级别为 ERROR。

import logging
logging.getLogger().setLevel(logging.ERROR)

如果不是根警告,可以改用以下代码段。

import warnings
warnings.filterwarnings("ignore")