python - 无法抑制在导入调用期间执行的警告
问题描述
当它们作为导入的一部分发出时,我无法过滤 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。
解决方案
感谢您提供最少的可重复示例!
我按照你的例子,每次都运行它们。但是我没有观察到与您相同的情况:
# 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 文件的最后一个版本也可以工作(即不显示警告)
推荐阅读
- javascript - 如果用户是管理员,则显示/生成元素的安全方式
- python - 在数据框的一列中查找相同的值,并为每个重复项创建一个新的数据框
- python - 多线程随机数和CPU监控
- sql-server - 具有多个用户和中央数据库的 .Net Frame Core 应用程序
- kdb - 在 q 中创建一个张开的表
- arrays - 如果可能,将非特定类型的变量转换为字符串
- java - 重新启动应用程序时事件处理程序重播?
- wpf - 通过 Binding 在运行时更改 WPF 控件样式
- java - 无法将 LocationData 放入加载程序
- azure-ad-b2c - 如何在声明类型的广告 b2c 自定义政策中获取当前日期和时间