我正在尝试通过以下方法使DeprecationWarning静音。
import warnings
warnings.filterwarnings(action='ignore')
from sklearn.ensemble import RandomForestRegressor
但是,它仍然显示:
DeprecationWarning:numpy.core.umath_tests是一个内部NumPy模块,不应导入。它将在将来的NumPy版本中删除。 从numpy.core.umath_tests导入inner1d
为什么会发生这种情况,我该如何解决?
我正在python 3.6.6,numpy 1.15.0和scikit-learn 0.19.2上运行它,添加category=DeprecationWarning
并没有帮助。
答案 0 :(得分:2)
发生这种情况的原因是Scikit resets your DeprecationWarning filter when you import it:
# Make sure that DeprecationWarning within this package always gets printed
warnings.filterwarnings('always', category=DeprecationWarning,
module=r'^{0}\.'.format(re.escape(__name__)))
鬼S!
我发现的唯一解决方法是暂时禁止stderr:
import os
import sys
sys.stderr = open(os.devnull, "w") # silence stderr
from sklearn.ensemble import RandomForestRegressor
sys.stderr = sys.__stderr__ # unsilence stderr
其中sys.__stderr__
是指系统的实际stderr(与sys.stderr
相对,后者只是告诉Python在哪里打印stderr)。
答案 1 :(得分:0)
不确定是否可行。但是我试图重新创建警告,但它已被静音,请尝试以下操作:
import logging
logging.captureWarnings(True)
根据docs“如果捕获为True,则警告模块发出的警告将被重定向到日志记录系统。”
这就是我所做的:
import logging
import re
import warnings
logging.captureWarnings(True)
warnings.filterwarnings('always', category=DeprecationWarning,
module=r'^{0}\.'.format(re.escape(__name__)))
warnings.warn("This is a DeprecationWarning",category=DeprecationWarning)
没有引发警告。
logging.captureWarnings(False)
warnings.warn("This is a DeprecationWarning",category=DeprecationWarning)
输出:
.../ipython:2: DeprecationWarning: This is a DeprecationWarning