首页 > 解决方案 > 无法抑制在导入调用期间执行的警告

问题描述

当它们作为导入的一部分发出时,我无法过滤 Python 中的警告。我已经用 Python3.8 测试了以下内容。

这有效:

档案一:

import warnings

def old_func():
    warnings.warn("This is an old function.")
    pass

文件 B:

import warnings
from file_a import old_func

warnings.simplefilter("ignore")
old_func()

警告消息按预期被抑制。但是,如果我像这样更改文件 A:

import warnings

def old_func():
    warnings.warn("This is an old function.")
    pass

old_func()

它停止工作。我认为那是因为我在导入之前没有设置过滤器,所以我更改了文件 B,如下所示:

import warnings
warnings.simplefilter("ignore")
from file_a import old_func
old_func()

仍然没有骰子。无论我做什么,都会发出警告。我还尝试了 catch_warnings() 上下文管理器,如下所示:

import warnings
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    from file_a import old_func
    old_func()

警告仍然发出。如果在导入期间发出警告,似乎无法忽略它。

我做了一些 hacky 的事情,比如临时制作 stderr 和 stdout 内存中的类似文件的对象,这很有效,但很糟糕。我想找到一种用合理的机器来做到这一点的方法。

由于这是一个命令行工具,它具有使用 setuptools 创建的入口点,因此将其打包为向最终用户的解释器添加 -W 选项的方式非常痛苦。

附带更新:我已经确认这适用于 Python 3.6,但不适用于 Python 3.8。

标签: pythonpython-3.ximportwarningssuppress-warnings

解决方案


感谢您提供最少的可重复示例!

我按照你的例子,每次都运行它们。但是我没有观察到与您相同的情况:

# file: a.py
import warnings

def old_func():
    warnings.warn("This is an old function.")
    pass

old_func()
# file: b.py
import warnings
warnings.simplefilter("ignore")
from a import old_func
old_func()

在 Windows CPython 上不会为我发出警告3.6.8。你能再检查一下吗?

我认为那是因为我没有在导入之前设置过滤器所以我更改了 File B 如下看起来对我来说非常合理

您的 A 文件的最后一个版本也可以工作(即不显示警告)


推荐阅读