Python 3.12 物理删除 distutils、imp 相关模块及 audioop/aifc/sunau 等,导致旧项目硬失败;pkgutil.ImpImporter 移除引发 pkg_resources 加载异常;pathlib.Path.resolve() 默认 strict=True 和 os.symlink() 权限检查强化亦带来静默行为变更。

distutils 和 imp 的移除不是兼容性“降级”,而是直接切断旧构建链和导入路径——旧项目跑不起来,不是因为语法错,是因为关键模块根本不存在了。
ModuleNotFoundError: No module named 'distutils' 是硬失败,不是警告
Python 3.12 已从源码中物理删除 distutils 目录,sys.stdlib_module_names 里查不到它,import distutils 必然抛出 ModuleNotFoundError。这不是环境没装好,是代码正踩在清理区上。
- 所有仍用
setup.py直接调用distutils.core.setup()的脚本,pip 构建阶段就会卡死在 “Preparing metadata (setup.py)” -
numpy.distutils不是独立包,它是 NumPy 旧版 C 扩展构建入口;只要项目依赖numpy,且含自定义 <code>build_ext,就必然崩溃 - 即使你把
from distutils.version import LooseVersion换成packaging.version.parse(),若下游库(如旧版setuptools)内部仍引用distutils,照样失败
pkgutil.ImpImporter 被删导致 pkg_resources 加载失败
pkgutil.ImpImporter 和 ImpLoader 在 3.12 中被一并移除,而 pkg_resources(尤其是老版本)依赖它解析 entry points。现象是:pip install 看似成功,但首次 import 时才报 AttributeError: module 'pkgutil' has no attribute 'ImpImporter'。
- 常见于使用
console_scripts的 CLI 工具(如旧版twine、pip-tools),启动即崩 - 升级
setuptools到 ≥67.0.0 可缓解,但无法修复已发布的 wheel —— 它们元数据里仍写死pkg_resources依赖 - 替代方案必须改用
importlib.metadata(Python 3.8+)或importlib.resources.files()加载资源,不能只换 import 语句
audioop/aifc/sunau 等小众模块消失,但影响常被低估
这些音频模块虽冷门,但一旦项目里有 import audioop 或调用 wave.open(..., 'r') → audioop.ratecv() 这类组合逻辑,就会直接中断。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
audioop的功能基本可用struct.unpack()+numpy替代,但要注意字节序和采样精度差异 -
aifc和sunau已无官方替代,必须转用pydub或soundfile,且需确认它们支持目标格式(如 AIFC 的压缩变体) - CI/CD 中若用
os.system('python -c "import aifc"')做兼容性检查,会静默失败——得改成捕获异常并 assert False
pathlib.Path.resolve() 默认 strict=True 影响部署脚本
这不是模块删除,但属于标准库行为强化,和 distutils 移除一样致命:旧写法 Path("static/css").resolve() 在目录不存在时不再返回拼接路径,而是抛 FileNotFoundError。
立即学习“Python免费学习笔记(深入)”;
- Web 应用静态资源定位、Docker 构建前的路径预检、日志目录初始化等场景极易中招
- 正确写法是显式加
strict=False,或先用.exists()判断,再决定是否.resolve() - Windows 上
os.symlink()也不再静默忽略权限错误,CI 用 WSL 构建镜像时得加--privileged或启用开发者模式
distutils.dir_util.copy_tree() 对符号链接的处理逻辑,和 shutil.copytree(..., symlinks=True) 不完全等价,静默差异会在生产部署时暴露。

















