Python 3.12 中 imp、pkgutil.ImpImporter 和 distutils 均被物理删除,必须用 importlib 等现代方案替代:imp 功能迁至 importlib.util;ImpImporter 错误需降级 Python 至 3.11 或锁定 setuptools==67.0.0;distutils 应弃用 setup.py,改用 pyproject.toml + build 工具。

Python 3.12 中直接 import imp、pkgutil.ImpImporter 或 distutils 会立即失败,这不是路径或权限问题,而是这些模块/属性已被物理删除。必须替换为 importlib 或其他现代等效方案。
import imp 报错 ModuleNotFoundError: No module named 'imp'
这是 PEP 594 的最终落地结果:imp 模块在 3.12 中彻底消失。旧代码里常见的 imp.load_source() 或 imp.find_module() 都不可用。
- 动态加载本地
.py文件:改用importlib.util.spec_from_file_location()→importlib.util.module_from_spec()→spec.loader.exec_module() - 查找模块位置:用
importlib.util.find_spec(name, package=None),它返回ModuleSpec对象,比imp.find_module()更安全、语义更清晰 - 不要试图回退到
pkgutil.iter_modules()来“模拟” find_module —— 它不提供路径匹配能力,且行为不一致
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'
这个错误多出现在 setup.py 构建阶段或某些老版本 setuptools/numpy 的安装流程中,根源是它们内部硬编码调用了已删除的 pkgutil.ImpImporter。
- 最稳妥解法是降级 Python 至 3.11:用
python3.11 -m venv .venv新建环境,再装依赖 - 若必须用 3.12,可临时锁定兼容版 setuptools:
pip install --force-reinstall setuptools==67.0.0(该版本仍保留对旧导入路径的 shim) - 注意:升级到最新 setuptools(如 70+)反而可能加剧问题,因其完全移除了兜底逻辑
ModuleNotFoundError: No module named 'distutils'
distutils 自 3.12 起正式退出标准库(PEP 632),但很多构建脚本仍隐式依赖它,尤其在调用 python setup.py build 时。
立即学习“Python免费学习笔记(深入)”;
- 优先弃用 setup.py:改用
pyproject.toml+build工具(pip install build),它不依赖 distutils - 若无法改造项目,用
python -m pip install --upgrade build替代手动调用 setup.py - 不要尝试从外部安装 python3-distutils 包——它只适配系统默认 Python 版本(如 Ubuntu 的 3.10),与你的 3.12 环境不兼容
真正麻烦的不是找不到替代写法,而是有些库(比如老版本 d2l 或 datasets)的 setup.py 本身调用了这些被删接口,你改了自己代码也没用。这时候要么切 Python 版本,要么手动 patch 第三方库的安装脚本——后者容易漏掉子依赖里的深层调用。


















