python 3.13主动移除pkgutil.impimporter和distutils,导致旧包构建脚本崩溃;报错堆栈中出现pkg_resources.__init__.py调用pkgutil.impimporter即为典型信号,根源在于setuptools

pkgutil.ImpImporter 被移除,distutils 被彻底删除,旧包构建脚本直接崩溃——这不是你操作错了,是 Python 3.13 主动切断了兼容性。
为什么 pip install 会卡在 pkgutil.ImpImporter?
很多旧包(尤其是 setuptools 低于 68.0 的版本、pkg_resources 依赖链)会在构建阶段硬编码调用 pkgutil.ImpImporter。Python 3.12 已废弃它,3.13 直接删掉。报错堆栈里出现 File ".../pkg_resources/__init__.py", line 2172, in register_finder(pkgutil.ImpImporter, ...) 就是典型信号。
- 不是所有包都会触发——只有那些从源码编译(
.tar.gz)而非安装预编译.whl的才会走到这一步 -
pip install --no-binary :all:会强制触发,但默认行为下,只要依赖树里有旧版setuptools,就可能被拉进来 - 降级
setuptools到反而更糟,因为更低版本对 3.13 的 ABI 更不适应
为什么提示 ModuleNotFoundError: No module named 'distutils'?
distutils 在 Python 3.12 被标记为 deprecated,3.13 彻底移除。但大量旧构建工具(如老版 numpy、scipy、cython 的 setup.py)仍直接 import distutils.core 或调用 distutils.util。哪怕你只装一个包,只要它的构建流程没迁移到 setuptools.build_meta,就会炸。
- 装
setuptools不能“恢复”distutils,它只是提供部分兼容 shim,无法覆盖所有用法 -
python -m ensurepip --default-pip也救不了,因为 pip 自身新版已放弃依赖distutils,但旧包的 setup.py 不认这个逻辑 - PyCharm 内置的旧 pip(比如 20.3.4)会因调用
distutils.util.strtobool等函数直接退出
为什么 numpy 1.23.x 这种“看起来支持 Python 3.x”的包也会失败?
版本号 ≠ 兼容性。numpy 1.23.5 发布于 2022 年底,那时 Python 3.13 还不存在。它的 setup.py 和 C 构建脚本硬依赖 distutils 和旧版 setuptools ABI。pip 解析 requirements.txt 时,若未指定版本约束,可能优先拉取源码包而非 wheel——尤其当 PyPI 上没有对应 Python 3.13 的 wheel 时。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 即使你本地已装 numpy 2.2.5,pip 安装其他包(如
d2l)时仍可能重新拉取 numpy 1.23.5 源码来满足其install_requires - 检查方法:
pip debug --verbose看 pip 是否启用了--only-binary;或加-v参数观察下载的是.whl还是.tar.gz - 临时解法:提前
pip install "numpy>=2.0"并加--force-reinstall,堵住旧版本入口
哪些包最容易中招?
不是按“名气”,而是按构建方式和维护状态。以下类型在 3.13 下高危:
- 未发布 Python 3.13 wheel 的包(如早期
torch、tensorflow、mxnet) - 仍用
setup.py+distutils构建的包(如老版pillow、pycurl、lxml) - 依赖
pkg_resources且未升级到importlib.metadata的包(如部分click插件、pluggy旧版) - 用
cython编译但未更新pyproject.toml构建后端的包
真正麻烦的从来不是“能不能装”,而是“装的时候悄无声息地用了错误的构建路径”。盯着日志里有没有 Building wheel for xxx 和 running build 这两行,比看最终成功与否更关键。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










