只在 notebook 中写 warnings.filterwarnings("ignore") 仅对当前单元格生效,无法覆盖内核启动等早期警告,且需重复添加;真正全局生效的配置须写入 jupyter_notebook_config.py 并重启服务。

为什么不能只在 notebook 里写 warnings.filterwarnings("ignore")
因为这条语句只对当前 notebook 生效,且必须放在每个需要屏蔽警告的单元格顶部(或至少在触发警告的代码之前)。如果你有几十个 notebook,每次新建都要手动加,还容易漏;更关键的是,它无法屏蔽内核启动、扩展加载、服务器初始化阶段产生的警告——那些根本没机会执行 Python 代码。
真正起作用的配置位置是 jupyter_notebook_config.py
这个文件控制整个 Jupyter Notebook 服务的行为,包括日志级别和警告过滤。它不是 notebook 自带的,需要你主动生成并修改:
- 先运行
jupyter --config-dir查看配置目录路径(通常是~/.jupyter或C:\Users\用户名\.jupyter) - 如果目录下没有
jupyter_notebook_config.py,就用命令生成:jupyter notebook --generate-config - 用文本编辑器打开该文件,在末尾添加:
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=DeprecationWarning)
warnings.filterwarnings("ignore", module="matplotlib")
注意:这里用了 category 和 module 参数精准过滤,而不是粗暴地 "ignore" 全局警告——否则可能掩盖掉真正该关注的 UserWarning 或 RuntimeWarning。
filterwarnings 的参数组合决定屏蔽精度
盲目设成 "ignore" 容易埋雷。实际中建议按需组合以下参数:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
category=FutureWarning:屏蔽“将来会废弃”的提示(如 pandas 2.0 升级警告) -
module="sklearn":只屏蔽 scikit-learn 相关警告,不影响其他库 -
message=".*convergence.*":用正则匹配警告文本(比如忽略所有含 “convergence” 的迭代不收敛提示) -
action="once":同一警告只显示一次,比完全 ignore 更安全
错误示例:warnings.filterwarnings("ignore", category=UserWarning) —— 很多数据读取失败、缺失值处理异常都属于 UserWarning,关掉后可能让 bug 静默失败。
重启内核不生效?你可能改错了地方
改完 jupyter_notebook_config.py 后必须重启整个 Jupyter 服务(不是只 restart kernel),否则配置不会加载。常见误操作:
- 以为改了
ipython_config.py就够了——不对,那是 IPython 控制台的配置,和 notebook 服务无关 - 在 conda 环境里启用了多个内核,但只更新了 base 环境的配置,而 notebook 实际用的是
myenv内核——要确认jupyter --config-dir输出的路径是否属于当前激活环境 - Windows 下用记事本保存时编码成了 UTF-8 with BOM,导致启动时报语法错误——务必用 VS Code、Notepad++ 等工具保存为纯 UTF-8
最稳妥的验证方式:启动 notebook 前在终端加 --debug 参数,观察日志里是否打印出 “Loaded config from …/jupyter_notebook_config.py”。










