首页 >后端开发 >Python教程 >打包 python RPM

打包 python RPM

DDD
DDD原创
2025-01-05 04:16:40753浏览

Packaging python RPMs

最近我正在执行当前项目中的一项非常具体的任务
为 Red Hat 工作,RHEL Lightspeed
ShellAI,这个项目是
相对较新,但我们希望开始为我们的量化宽松开发 RPM
朋友们开始使用该工具并在他们的管道中测试它。

我知道包装和一般Python东西的方法,但是伙计,我必须
告诉你,这个包装任务花了我整整两天的时间才完成。让我
指导您快速完成任务的详细信息。

TLDR;最终一切顺利,这就是最终的 PR:
https://github.com/rhel-lightspeed/shellai/pull/4

任务详情

ShellAI 项目计划在 RHEL 9 和即将推出的版本下发布
RHEL 10。作为奖励目标,我们希望它也能在 RHEL 8 上运行。

根据上面的陈述,如果您之前已经使用过 RHEL,那么您已经
猜测挑战将是依赖项的版本
在 RHEL 中。

  • RHEL 8 有 Python 3.6
  • RHEL 9 有 Python 3.9
  • 最后,RHEL 10 有 Python 3.12

我们还希望相对频繁地进行开发构建,以便
在我们开发工具时测试新功能。

对于开发部分,我们想使用
pdm 来管理我们的依赖关系和
构建。当我们完成任务时,我们注意到 pdm 后端不是
已在 RHEL 存储库中提供,因此我们使用默认的 setuptools build
后端。

由于我们的系统目标“相对较新”,我们希望对
进行现代化改造 项目并确保我们使用新的工具/结构和格式。对于
我们选择使用 pyproject.toml 来做,因为它是通过 pdm init 生成的
当我们引导项目时。

构建 RPM 时遇到的问题

最初,我们的想法是使用最新的 python 功能和项目
结构,例如 pyproject.toml 文件而不是旧的 setup.py。
当你开始一个新项目时,一切都很酷而且很新,你会感到非常兴奋
要使用那些东西,唯一的问题是:

  • 它们非常适合开发过程,但不适合打包。

最初,当我开始任务时,我认为我们可以使用新的 RPM
用于构建项目的宏,因为我们使用 pyproject.toml 和 pdm
管理依赖关系。

为此,Fedora 文档有一篇不错的文章,名为 Python Packaging
指南
他们去哪里的详细信息。虽然指南涵盖了几乎所有主题和案例
你可能需要,即使有一个例子
规格文件。

我们的主要目标是 RHEL,我们可以想象遵循一切
从指南中可以按原样工作,对吗?不,原因在于
RHEL 存储库中提供的版本。即使新的宏
指南中指出的可能在构建过程中起作用,您将无法生成
以下目标的最终 RPM:

  • RHEL 8 将在 %generate_buildrequires 期间向您抛出错误,如下所示 该版本中附带的 python3-setuptools 版本非常旧并且确实 不太认识新的 pyproject.toml 格式。
  • RHEL 9 将能够完成大部分步骤,但会失败 %pyproject_wheel,因为它将构建一个名为 UNKNOWN 的包。这 发生这种情况是因为(再次)RHEL 9 下提供的 python3-setuptools 是 老的。它无法识别由 pyproject.toml 规范

解决方案

我们必须创造遗产
setup.py
文件以便继续进行 Python 轮构建,并避免数据
pyproject.toml 和我们的旧版 setup.py 文件之间存在重复,我们
使用 tomllib,因为
原因如下:

  • tomllib 在 RHEL 8 中可用(通过 pypi 和 rpm 打包)
  • Python 3.11 之后,tomllib 原生捆绑到标准库中

正如您在上面看到的,我们使用 tomllib 加载 pyproject.toml 文件并且
阅读必要的字段并简单地更新我们的旧版 setup.py。这样我们
能够修改 pyproject.toml ,每当我们推送新版本时,我们都会
也能够在我们的旧版 setup.py 中保持一致性。

关于规范文件,我们必须返回并使用文档中所说的
“201x时代”Python打包
指南。
本质上,我们使用的是旧的 python setup.py build ... 命令
(显然是通过宏)来构建项目。

该解决方案使我们能够在我们想要的 RHEL 版本之间保持一致性
支持,同时继续使用 pdm 和闪亮的新功能
我们希望得到发展。

以上是打包 python RPM的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn