distutils已被弃用,python 3.12起完全移除;其所谓“优化”徒劳,因不支持依赖解析、abi隔离与现代构建标准;应迁移到pyproject.toml+setuptools+cibuildwheel。

distutils 已被弃用,不建议用于新项目中的 C 扩展编译优化。 Python 3.12 起已完全移除,3.10+ 开始发出 DeprecationWarning;实际构建中继续用它不仅无法获得现代工具链支持(如 PEP 517/518 构建后端、交叉编译、多平台 wheel 生成),还会掩盖链接失败、ABI 不匹配等底层问题。
为什么 distutils 的“优化”本质上是徒劳的
所谓“优化编译过程”,比如改 build_ext 参数、传额外 extra_compile_args 或绕过 setup.py 直接调用 gcc,在 distutils 框架下只能做到表层控制。它不管理依赖解析、不隔离构建环境、不处理多 Python 版本 ABI 差异(如 cp39 vs cp311),更无法对接 manylinux 或 musllinux 标准。你加的 -O3 可能被 setuptools 后续覆盖,你写的 define_macros 在交叉编译时根本不会生效。
替代方案:用 pyproject.toml + setuptools + cibuildwheel
真实可落地的“优化”来自构建流程重构,而非 distutils 参数微调:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 把编译逻辑从
setup.py迁移到pyproject.toml,明确声明构建依赖(如setuptools>=61.0、pybind11-build)和构建后端 - 用
setuptools.Extension替代distutils.core.Extension,它支持depends自动触发重编译、optional=True容错、以及get_linker_so_libs()等调试钩子 - 在 CI 中用
cibuildwheel生成多平台 wheel,它自动处理CC/CXX切换、sysroot 配置、符号可见性(-fvisibility=hidden)等细节,比手写distutils配置可靠十倍
如果必须兼容旧代码:最小安全迁移路径
已有 setup.py 且暂不能废弃 distutils?至少做三件事止损:
- 在
setup.py顶部插入import warnings; warnings.filterwarnings("error", category=DeprecationWarning, module="distutils"),强制暴露所有 distutils 使用点 - 将
from distutils.core import setup改为from setuptools import setup,并确保setup()调用中不传ext_modules给 distutils 的build_ext子类 - 把所有
distutils.command.build_ext子类重写为继承setuptools.command.build_ext.build_ext,否则python -m build会静默跳过你的自定义逻辑
真正卡住编译速度或链接失败的地方,几乎从来不是 distutils 的参数没设对,而是头文件路径混乱、__attribute__((visibility("default"))) 缺失、或者 numpy.get_include() 返回路径未被正确传入 include_dirs —— 这些问题在 setuptools + pyproject.toml 下有标准调试路径,在 distutils 里只能靠 print 大法硬猜。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










