pkg_resources被弃用因其非标准库组件且不应作为运行时依赖,python 3.12起默认不安装setuptools导致modulenotfounderror;推荐改用importlib.metadata和importlib.resources。

pkg_resources 被弃用不是因为“不好用”,而是因为它本质上不属于 Python 标准库,也不该是运行时依赖——它来自 setuptools,而 setuptools 是一个构建/发布工具,不是语言运行环境的一部分。
pkg_resources 在 Python 3.12+ 直接报错:No module named 'pkg_resources'
- Python 3.12 默认不安装
setuptools,所以import pkg_resources会立刻触发ModuleNotFoundError - 即使你之前没显式 import,只要用了 pip 安装的包(尤其带
entry_points或版本检查逻辑),底层可能隐式调用它,一运行就崩 -
setuptools 82.0.0(2026年2月发布)已彻底移除pkg_resources模块,不再随安装提供
importlib.metadata 和 importlib.resources 是标准库原生方案
-
importlib.metadata从 Python 3.8 就存在,3.12 已完全承接pkg_resources.get_distribution()、iter_entry_points()等职责 -
importlib.resources.files()从 Python 3.9 起成为资源访问首选,返回Traversable对象,行为类似pathlib.Path,天然支持 zip 包、冻结可执行文件(如 PyInstaller)、命名空间包 - 零额外依赖、无运行时副作用、与
importlib.metadata协同良好
迁移时最容易踩的坑
- 把
pkg_resources.resource_filename(<strong>name</strong>, "data.json")改成拼路径:os.path.join(os.path.dirname(<strong>file</strong>), "data.json")—— 这在 zip 包或 PyInstaller 打包后必然失败 - 误以为
importlib.resources.open_text()还能用:它已在 Python 3.9+ 被标记为弃用,必须改用files().joinpath("data.json").read_text() - 忘记处理 Python 版本兼容:3.7–3.8 需要第三方包
importlib-resources,3.9+ 可直接用标准库 - 用
importlib.metadata.distribution("xxx").location想获取路径:这个属性已不存在,得用.locate_file("")返回Path对象
真正麻烦的从来不是换函数名,而是那些藏在旧代码里、靠 <strong>file</strong> 或 sys.path 硬拼路径的逻辑——它们在标准库新接口下根本不可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











