问题描述
当它们作为导入的一部分发出时,我无法过滤 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 文件的最后一个版本也有效(即不显示警告)