Python 3.12移除distutils导致旧版PyTorch生态构建失败,因torchvision等子包依赖distutils构建流程,且预编译wheel不含cp312标签,ABI不兼容引发运行时符号加载错误或CUDA崩溃。

Python 3.12 移除了 distutils,旧版 PyTorch 构建直接失败
PyTorch 本身不直接依赖 distutils,但它的子包(如 torchvision、torchaudio)在 2024 年前的多数版本中,仍通过 setup.py + distutils 流程构建。Python 3.12 正式移除该模块,导致 pip 尝试从源码编译时立即报错:ModuleNotFoundError: No module named 'distutils'。这不是“冲突”,而是构建链断裂。
- 典型触发场景:执行
pip install torch==1.13.1 torchvision==0.14.1(这些版本最高只支持到 Python 3.11) - 即使你用
--only-binary=all强制跳过源码编译,旧 wheel 包也未针对 3.12 编译过,pip 会直接跳过匹配项,返回No matching distribution found - PyPI 上的旧 wheel 文件名含
cp311(代表 CPython 3.11),不含cp312—— pip 根本不会考虑安装它们
torch 和 torchvision 版本组合在 3.12 下可能注册失败
即便侥幸装上某个旧版 torch(比如通过非官方 wheel 或降级 pip),torchvision 的 C++ 算子(如 torchvision::nms)在 Python 3.12 的 ABI 下无法正确注册。运行时抛出 RuntimeError: operator torchvision::nms does not exist,不是导入失败,而是底层符号未加载。
- 根本原因:CPython 3.12 修改了部分内部 API(如
PyTypeObject初始化逻辑),而旧版 torchvision 的二进制扩展未适配 - 这种问题在 Windows 上更明显,表现为
OSError: [WinError 1114] DLL 初始化例程失败 - 仅靠升级
numpy或typing_extensions无法修复 —— 这是 PyTorch 生态二进制层的硬性断层
conda 安装看似成功,实则掩盖了 CUDA 兼容风险
用 conda 安装旧版 PyTorch(如 pytorch==1.13.1)到 Python 3.12 环境时,conda 可能静默跳过不兼容组件,或强制降级其他依赖。结果表面 import torch 成功,但调用 GPU 相关功能时崩溃。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 例如:
torch.cuda.is_available()返回True,但torch.randn(10).cuda()触发 segmentation fault - 这是因为 conda 安装的
pytorch-cuda=11.7wheel 实际绑定的是 Python 3.11 的 ABI,与 3.12 运行时内存布局不一致 - 官方 conda channel(
pytorch)至今(2026年6月)未发布任何标有py312的 PyTorch 构建;所有带py312标签的包均来自社区非官方 channel,无 CUDA 支持保证
真正安全的做法不是“绕过”,而是隔离
试图在 Python 3.12 中硬塞旧版 PyTorch,本质是在对抗构建工具链和二进制 ABI 的演进。所有临时方案(如 patch setup.py、替换 distutils stub、混用 pip/conda)都会在后续升级中失效,且难以复现。
立即学习“Python免费学习笔记(深入)”;
- 最轻量解:用
conda create -n pt311 python=3.11创建独立环境,再按 PyTorch 官网推荐命令安装(例如conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia) - 若必须用 3.12,只考虑 nightly 版本(
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121),但需接受其无长期支持、API 不稳定、文档缺失 - 离线部署时,务必确认下载的
.whl文件名含cp311或cp312—— 混用会导致静默失败,而非明确报错

















