gpt4 book ai didi

python - 如何确定地抑制 Python 中的 DeprecationWarning?

转载 作者:行者123 更新时间:2023-11-28 22:12:57 26 4
gpt4 key购买 nike

我相信这个问题已经被提出了很多次,但我有一个特定的用例,我无法使用网络上描述的许多方法解决问题。

在我的一个项目中,我正在使用 joblib 库,它显示 DeprecationWarning 因为它在内部某处使用了 imp 库:

from sklearn.externals.joblib import Parallel, delayed

def main():
xs = Parallel()(delayed(lambda x: x**2)(i) for i in range(1, 6))
print(sum(xs))

if __name__ == '__main__':
main()

我试图用解释器选项 -W 过滤掉警告,但它没有帮助:

$ python -W ignore example.py                                                                                                                   
[...]/lib/python3.7/site-packages/sklearn/externals/joblib/externals/cloudpickle/cloudpickle.py:47:
DeprecationWarning: the imp module is deprecated in favour of importlib;
see the module's documentation for alternative uses import imp
55

此外,我正在尝试使用 warnings 模块进行显式过滤,但它也无济于事:

import warnings
warnings.simplefilter('ignore', category=DeprecationWarning)
from sklearn.externals.joblib import Parallel, delayed

def main():
xs = Parallel()(delayed(lambda x: x**2)(i) for i in range(1, 6))
print(sum(xs))

if __name__ == '__main__':
main()

我在 matplotlib 模块和其他一些第三方库中遇到了类似的问题。可能还有其他一些方法(即环境变量),但我不明白为什么这些解决方案不起作用。

谁能解释警告系统在 Python 中的实际工作原理?第三方库有可能故意覆盖客户端的警告设置吗?我会说这个问题对我来说是最晦涩的话题之一。

最佳答案

应要求,这里将答案作为单独的帖子:

诀窍是在导入 sklearn(或使用 sklearn 的依赖项,在我的例子中是 hdbscan 包)时使用“with”警告:

with warnings.catch_warnings():
# filter sklearn\externals\joblib\parallel.py:268:
# DeprecationWarning: check_pickle is deprecated
warnings.simplefilter("ignore", category=DeprecationWarning)
import hdbscan

这将仅针对此模块禁用 DeprecationWarning(因为 warnings-modification 附加到 with-block)。

重要的是将此语句放在导入模块的代码中的第一个位置,否则将无法运行。例如。如果我在 __init__.py 中加载 hdbscan,并且上面的代码块出现在一些也加载 hdbscan 的子类中,我仍然会得到 DeprecationWarning,因为如果模块/包已经加载,Python 会忽略任何后续的 import 语句。

因此,重要的是要检查哪些模块/包使用了 joblib\parallel.py,以及从线性代码的角度来看,这些模块/包最早加载到 python 对象堆的位置。

[编辑]

正如@devforfu 在评论中指出的那样,上述解决方案(不再)有效。自从 Python 3.7 以来,我再次调查了这个问题DeprecationWarning 在 __main__ 中的代码直接触发时再次默认显示。。此外,ignore 警告似乎在依赖项显式加载其他包的折旧模块时不起作用。

这就是我的 hdbscan 示例中发生的情况,它加载了折旧模块 sklearn.external.sixsklearn.externals.joblib

以下是最终解决这个恼人问题的方法:

  • 确保您已明确安装已弃用的独立软件包,例如conda install -c conda-forge joblib 6
  • 创建一个将覆盖依赖项导入的假导入,例如:
try:
sys.modules['sklearn.externals.six'] = __import__('six')
sys.modules['sklearn.externals.joblib'] = __import__('joblib')
import hdbscan
except ImportError:
import hdbscan

如果没有导入错误,将使用独立的 6 和 joblib。否则,例如如果用户没有安装 six 或 joblib,该程序仍然可以运行(因为它从 sklearn.externals 加载了这两个模块),但它会显示折旧警告。

关于python - 如何确定地抑制 Python 中的 DeprecationWarning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54379418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com