Python3.12弃用distutils后怎么办_全面迁移至setuptools教程

Python3.12弃用distutils后怎么办_全面迁移至setuptools教程p p 只需将 from distutils core import setup 替换为 from setuptools import setup 即可兼容大部分项目 但需注意废弃参数 继承类变更 numpy 移除 numpy distutils 等问题 并推荐迁移到 pyproject toml 大多数老项目里那行 from

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



 

只需将 from distutils.core import setup 替换为 from setuptools import setup 即可兼容大部分项目,但需注意废弃参数、继承类变更、numpy 移除 numpy.distutils 等问题,并推荐迁移到 pyproject.toml。

python3.12弃用distutils后怎么办_全面迁移至setuptools教程

大多数老项目里那行 from distutils.core import setup 确实只需改成 from setuptools import setup,接口几乎完全兼容。但别急着提交——setup() 调用里如果用了 distutils 特有参数(比如 use_2to3convert_2to3_doctests),运行时会静默忽略或报错。这些参数在 setuptools 中早已废弃,且无替代实现。

常见踩坑点:

  • setup.py 里写了 cmdclass={‘build_ext’: MyBuildExt},而 MyBuildExt 继承自 distutils.command.build_ext.build_ext → 必须改为继承 setuptools.command.build_ext.build_ext
  • 用了 numpy.distutils(尤其旧版 NumPy 项目)→ 这个子模块早在 NumPy 1.24 就被移除,Python 3.12 下必然失败,需升级 NumPy 并改用 setuptools + pybind11meson 替代
  • CI 流水线里执行 python setup.py bdist_wheel → 改成 pip wheel –no-deps –wheel-dir ./dist . 更可靠,避免触发任何隐式 distutils 路径

PyPI 上根本不存在叫 distutils 的包。所谓“兼容包”其实是误导——有人上传过同名包,但它是空壳或仅含文档,无法提供实际模块。Python 3.12 彻底剥离了 distutils 的 C 源码和 Python 实现,它不再是可 pip 安装的组件。

真正起作用的是 setuptools:它在内部模拟了部分 distutils 行为(比如 build_extinstall 命令),但只在被显式调用时加载。所以你看到的“恢复 distutils”本质是让 setuptools 提前注册这些命令。

操作建议:

  • 确保虚拟环境里装的是 setuptools >= 65.5.0(低于此版本对 Python 3.12 支持不完整)
  • 不要手动 import distutils,哪怕只是为了检查是否存在——直接用 import setuptools,然后调用 setuptools.setup()
  • 若 PyCharm 报红 distutils 找不到,不是解释器问题,而是 IDE 缓存未刷新;重启解释器或清掉 .idea/caches 目录即可

不是必须,但越早做越省事。PEP 621 规范下,pyproject.toml 可以完全取代 setup.py 中 90% 的声明式配置(nameversiondependenciesentry_points 等)。剩下的构建逻辑(如自定义编译步骤)得靠 build-backend 指定,比如 setuptools.build_metahatchling.build

迁移注意点:

  • setup.py 里动态生成 version(如读 init.py)→ 改用 dynamic.version + attrcall 方式,在 toml 中声明
  • 用了 MANIFEST.in → 仍可保留,setuptools 依然识别它;但推荐改用 include/exclude 写进 toml
  • 项目含 C 扩展且用 Extension 类 → pyproject.toml 不支持直接写 Python 对象,得抽到单独的构建脚本(如 build.py),再通过 build-backend 引入

遇到这种包(比如某个 2018 年发布的私有工具、或锁死依赖的闭源 SDK),先查它有没有 wheel:运行 pip index versions package-name,看是否提供 cp312 标签的 wheel。有就直接装,绕过本地构建。

没有 wheel 时,临时解法只有两个:

  • 降级 Python:用 pyenv install 3.11.9 && pyenv local 3.11.9 切换,这是最稳的兜底方案
  • 强制 patch:下载源码后,用 sed -i ’s/from distutils.core import setup/from setuptools import setup/’ setup.py(Linux/macOS),再 pip install -e .。注意有些包的 setup.py 是生成的,得找上游模板改

别信“安装 distutils 兼容包”这类说法——它要么是无效包,要么只是把 setuptools 的部分代码重打包,反而可能引入版本冲突。真正的分水岭不在能不能装上,而在你愿不愿意接受:从 Python 3.12 开始,distutils 就是没了,不是藏起来了。

Python免费学习笔记(深入):立即使用

 
在学习笔记中,你将探索 Python 的核心概念和高级技巧!



小讯
上一篇 2026-04-18 23:26
下一篇 2026-04-18 23:24

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/269247.html