微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法抑制在导入调用期间执行的警告

如何解决无法抑制在导入调用期间执行的警告

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

这有效:

文件 A:

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 in-memory file-like-objects,这可行,但很糟糕。我想找到一种方法来使用合理的机器来做到这一点。

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

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

解决方法

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

我遵循了您的示例,每次都运行它们。但我没有观察到和你一样的事情:

# 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 上不会为我发出警告。你能再查一下吗?

我认为那是因为我在导入之前没有设置过滤器,所以我按如下方式更改了文件 B 对我来说看起来很合理

您的 A 文件的最后一个版本也有效(即不显示警告)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。