- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我相信这个问题已经被提出了很多次,但我有一个特定的用例,我无法使用网络上描述的许多方法解决问题。
在我的一个项目中,我正在使用 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.six
和 sklearn.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/
%matplotlib 笔记本 import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklea
我们正在将我们的应用程序从 Django 1.6 更新到 1.7。 我们看到很多这样的消息:RemovedInDjango18Warning 有没有办法过滤它们?它们在导入过程中被释放。 我们尝试了
我已经升级到 Django 1.4,现在当我运行我的开发服务器时,我收到以下警告: /home/flc/venvs/myprj/lib/python2.6/site-packages/django/v
我的一些程序运行没有问题,但我仍然收到以下错误代码。它对程序本身没有影响,但我仍然想解决它。 C:\Program Files\JetBrains\PyCharm Community Edition
我最近升级到 numpy 1.9dev。(为了改进 OpenBlas 支持)。 我有一些代码可以执行 x-y其中 x 和 y 是来自概率分布的样本。如果分布是伯努利分布,则它们是 bool 值。如果分
首先我查看了所有相关问题。给出了非常相似的问题。 所以我遵循了链接中的建议,但没有一个对我有用。 Data Conversion Error while applying a function to
我正在使用 python docs 提供的 grouper 配方的修改形式: from itertools import chain, islice def grouper(iterable, n):
我相信这个问题已经被提出了很多次,但我有一个特定的用例,我无法使用网络上描述的许多方法解决问题。 在我的一个项目中,我正在使用 joblib 库,它显示 DeprecationWarning 因为它在
我经常从我无法控制的库中得到很多弃用,我不想用它们污染测试执行。 如何在不冒从我自己的代码中禁用弃用的风险的情况下避免这种情况? 例子: ===============================
我已经搜索过了,但无法完全找到答案。我想要一个来自 sympy 的具有特定维度的 Matrix 的简单子(monad)类。当我在 python 2.7 中运行此代码时: from sympy impo
已经应用了 require('events') 但仍然不断显示警告,我在这里做错了什么?为什么 process.EventEmitter 即使未使用也会一直显示? Node v6.7.0 它可以工作,
我最近在我的一台机器上更新了 Python 的 Numpy 包,显然我一直依赖 a deprecated feature of numpy现在有一段时间了: >>> np.__version__ '1
我在将模型的预测与训练集的标签进行比较时遇到了问题。我使用的数组具有以下形状: Training set (200000, 28, 28) (200000,) Validation set (1000
使用文档运行 rasa_core 示例 › python3 -m rasa_core.run -d models/dialogue -u models/nlu/default/current 并在对话
尝试更新 MongoDB 文档获取弃用警告为 (node:71307) [DEP0079] DeprecationWarning: Custom inspection function on Obje
当我运行 pytest 时,我收到了来自 3rd 方库的一些弃用警告。我想知道我自己的代码中的任何弃用警告,但不是在与另一个 3rd 方库捆绑在一起的库的供应商副本中。 This answer帮助我中
我是当我尝试运行 nodemon app.js socioboard-api/user 时,出现以下错误 [nodemon] 1.19.3 [nodemon] to restart at any ti
我想使用以下方法获取帖子文档的数量: db.collection('posts').count() 但是,我收到了警告: DeprecationWarning: collection.count is
我有一段代码如下(使用 python 2.7.12 运行): self.config = ConfigParser() self.config.read(self.config_file) 其中 se
DeprecationWarning、PendingDeprecationWarning 和 FutureWarning 之间有什么区别?我在Python 3 documentation中看到目标“受
我是一名优秀的程序员,十分优秀!