当前位置: 首页 > news >正文

pyproject.toml 的历史背景和原理

历史背景

PEP 517 和 PEP 518 是 pyproject.toml 诞生的关键推动力:

  1. PEP 518 (2016):提出了 pyproject.toml 文件格式,用于指定构建系统要求
  2. PEP 517 (2017):定义了构建前端和后端的接口标准,使构建过程标准化
  3. 传统问题:之前依赖 setup.py 和 setuptools,缺乏标准化,构建环境不一致

设计原理

  1. 声明式配置:使用 TOML 格式,更易于机器解析和人类阅读
  2. 构建系统隔离:明确指定构建依赖,避免环境污染
  3. 可扩展性:支持多种构建后端(setuptools, poetry, flit, hatch等)
  4. 元数据统一:包含项目元数据、构建配置、工具配置等

setup.py vs pyproject.toml 调用方法差异

setup.py(传统方式)

# setup.py
from setuptools import setup, find_packagessetup(name="my-package",version="1.0.0",packages=find_packages(),install_requires=["requests>=2.25.0","numpy>=1.19.0"],extras_require={"dev": ["pytest", "black"],"docs": ["sphinx"]},entry_points={"console_scripts": ["my-cli=my_package.cli:main"]}
)

构建命令

# 源码安装
python setup.py install# 开发模式
python setup.py develop# 构建分发包
python setup.py sdist bdist_wheel

pyproject.toml(现代方式)

# pyproject.toml
[build-system]
requires = ["setuptools>=61.0.0", "wheel"]
build-backend = "setuptools.build_meta"[project]
name = "my-package"
version = "1.0.0"
dependencies = ["requests>=2.25.0","numpy>=1.19.0"
][project.optional-dependencies]
dev = ["pytest", "black"]
docs = ["sphinx"][project.scripts]
my-cli = "my_package.cli:main"[tool.setuptools]
packages = {find = {}}

构建命令

# 使用 PEP 517 兼容工具构建
pip install -e .  # 开发模式
pip install .     # 安装
python -m build   # 构建分发包# 或者使用特定后端
python -m setuptools.build_meta

关键差异对比

特性setup.pypyproject.toml
格式Python 代码TOML 声明式配置
构建依赖隐式依赖 setuptools显式声明在 [build-system]
环境隔离差,依赖全局环境好,明确构建环境
可重现性
安全性执行任意代码只读配置
元数据代码中定义声明式配置
扩展性有限支持多种后端

RPM 包管理版本支持情况

RPM 版本支持时间线

RPM 版本发布时间pyproject.toml 支持关键特性
RPM 4.112015❌ 不支持传统 setup.py only
RPM 4.122017⚠️ 有限支持初步 PEP 517 实验
RPM 4.132018⚠️ 基本支持支持 %pyproject_buildrequires
RPM 4.142019✅ 基本完整支持 %pyproject_wheel
RPM 4.152020✅ 完整支持完整 PEP 517/518 支持
RPM 4.16+2021+✅ 成熟支持优化构建流程

不同 RPM 版本的 spec 文件写法

RPM 4.11-4.12(传统方式)
%build
python setup.py build%install
python setup.py install --root=%{buildroot}
RPM 4.13-4.14(过渡期)
%build
# 手动处理 pyproject.toml
python -m pip wheel --no-deps --no-build-isolation -w dist .%install
python -m pip install --no-deps --no-index --find-links=dist \--prefix=%{buildroot}%{_prefix} .
RPM 4.15+(现代方式)
%build
%pyproject_wheel%install
%pyproject_install

针对低版本 RPM 4.14 的解决方案

# 对于 RPM 4.14,需要手动实现 PEP 517 构建
%build
export PIP_NO_BUILD_ISOLATION=0
export PYTHONPATH=%{_builddir}/%{name}-%{version}# 手动构建 wheel
python -m pip wheel --no-deps --no-build-isolation --wheel-dir=dist .%install
rm -rf %{buildroot}
mkdir -p %{buildroot}%{python3_sitearch}# 手动安装 wheel
WHEEL_FILE=$(ls dist/*.whl | head -1)
python -m pip install --no-index --no-deps --ignore-installed \--target=%{buildroot}%{python3_sitearch} \--no-build-isolation \${WHEEL_FILE}

构建后端支持矩阵

构建后端RPM 4.14 支持RPM 4.15+ 支持说明
setuptools✅ 通过 pip wheel✅ 原生支持最常用
poetry⚠️ 需要 poetry-core✅ 完整支持需要额外依赖
flit⚠️ 需要手动处理✅ 完整支持简单项目
hatch⚠️ 有限支持✅ 完整支持新兴工具
pdm❌ 不支持⚠️ 有限支持较新工具

兼容性建议

  1. 对于低版本 RPM:使用 pip wheel 手动构建
  2. 检查构建后端:确保构建依赖在 RPM 环境中可用
  3. 测试验证:在不同 RPM 版本上测试构建过程
  4. 回退方案:准备 setup.py 作为备选(如果需要支持很旧的系统)

现状总结

  • RPM 4.15+:推荐使用 %pyproject_wheel%pyproject_install
  • RPM 4.14:需要手动处理,但可以正常工作
  • RPM 4.13 及以下:建议升级或使用传统 setup.py 方式

现在大多数现代 Linux 发行版(RHEL 8+、Fedora、openEuler 等)都使用 RPM 4.14+,可以较好地支持 pyproject.toml 构建。


文章转载自:

http://SorKBa4V.bsbcp.cn
http://DNMrLXf0.bsbcp.cn
http://RPgm6GdH.bsbcp.cn
http://fgluOoc5.bsbcp.cn
http://KnK1m9C6.bsbcp.cn
http://zULCQmSn.bsbcp.cn
http://PRLLMh3g.bsbcp.cn
http://1J6QCt5h.bsbcp.cn
http://iC3n8ymS.bsbcp.cn
http://keN8uPqf.bsbcp.cn
http://z8l1ZX9D.bsbcp.cn
http://xkaBu0ST.bsbcp.cn
http://nCvnh2DM.bsbcp.cn
http://ro11b9w9.bsbcp.cn
http://xRtIhSo4.bsbcp.cn
http://CNnTF8Go.bsbcp.cn
http://E0THjMfZ.bsbcp.cn
http://XcA2Bwey.bsbcp.cn
http://Iqfj2wdz.bsbcp.cn
http://Md24BNyS.bsbcp.cn
http://azFvqAml.bsbcp.cn
http://3xi1fmd4.bsbcp.cn
http://JpszyZYL.bsbcp.cn
http://UpkiLNHy.bsbcp.cn
http://qMoyoUcd.bsbcp.cn
http://YOCKZ6w5.bsbcp.cn
http://f5K0XAUA.bsbcp.cn
http://SCEiMlku.bsbcp.cn
http://7ZtvcBdY.bsbcp.cn
http://wwVd10Y4.bsbcp.cn
http://www.dtcms.com/a/378003.html

相关文章:

  • vue知识点总结
  • macos arm自动编译x264和x265 Android平台so库
  • 三甲地市级医院数据仓湖数智化建设路径与编程工具选型研究(下)
  • Excel批量处理一列数据---分列功能
  • 从Miniflux 到 NextFlux:一步升级,拥抱现代化阅读体验
  • 机器视觉之图像处理篇
  • Find 命令详解
  • (九)Spring Cloud Alibaba 2023.x:微服务接口文档统一管理与聚合
  • 【C++深学日志】从0开始的C++生活
  • C#---Expression(表达式)
  • DCS控制回路优化:基于WebSocket的实时参数远程调校方法论
  • WebSocket压缩传输优化:机器视觉高清流在DCS中的低延迟方案
  • Java 软件测试(三):Mockito打桩与静态方法模拟解析
  • 大数据与AI:一场“数据盛宴”与“智能大脑”的奇妙邂逅
  • 前端学习之后端java小白(四)之数据库设计
  • 构建高效协作的桥梁:前后端衔接实践与接口文档规范详解
  • 基于 Vue+SQLite3开发吉他谱推荐网站
  • Skynet火焰图swt搭建
  • 临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
  • InfoSecWarrior CTF 2020: 01靶场渗透
  • SciKit-Learn 全面分析分类任务 wine 葡萄酒数据集
  • JMeter的安装部署
  • Lua语言基础笔记
  • Django的session机制
  • 从 @Component 到 @Builder:深度拆解 ArkTS 声明式 UI 与 @ohos.mediaquery 的协同实战
  • 字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
  • 分布式部署的A2A strands agents sdk架构中的最佳选择,使用open search共享模型记忆
  • 【设计模式】抽象工厂模式
  • LeetCode 刷题【72. 编辑距离】
  • gitlab流水线与k8s集群的联通