第 2 章 打包 Python 3 RPM
您可以使用 DNF 软件包管理器在系统上安装 Python 软件包。DNF 使用 RPM 软件包格式,它提供更多的对软件的下游控制。
与原生 Python 软件包相比,将 Python 项目打包到 RPM 软件包中具有以下优势:
- 可以对 Python 和非 Python 软件包的依赖项,并严格由 DNF 软件包管理器强制执行。
- 您可以用加密的方式为软件包签名。使用加密签名,您可以将操作系统的其余部分与 RPM 软件包的内容进行验证、集成和测试。
- 您可以在构建过程中执行测试。
原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。历史上,大多数 Python 项目使用 distutils
或 setuptools
工具打包,并在 setup.py
文件中定义软件包信息。但是,创建原生 Python 软件包可能性随着时间而演变:
-
要打包使用
setup.py
文件的 Python 软件,请按照本文档操作。 -
要使用
pyproject.toml
文件打包更现代的软件包,请参阅 pyproject-rpm-macros 中的README
文件。请注意,pyproject-rpm-macros
包含在 CodeReady Linux Builder (CRB)存储库中,其包含不受支持的软件包,并可能会随时间变化来支持较新的 Python 打包标准。
2.1. 示例 Python 软件包的 spec 文件描述 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
与非 Python RPM spec
文件相比,Python 项目的 RPM spec
文件有一些具体信息。
请注意,建议 Python 库的任何 RPM 软件包名称包含 python3-
前缀。
请参阅以下 python3-pello
软件包示例中有关 Python RPM spec
文件的备注。
- 使用 Python 编写的 pello 程序的 SPEC 文件示例
- 1
- 通过定义
python3_pkgversion
宏,您可以设置将为哪个 Python 版本构建此软件包。要为默认的 Python 版本3.12
进行构建,请删除该行。 - 2
- 将 Python 项目打包到 RPM 中时,需要将
python-
前缀添加到项目的原始名称中。这里的项目名称是Pello
,因此源 RPM (SRPM)的名称是python-pello
。 - 3
BuildRequires
指定了构建和测试此软件包所需的软件包。在BuildRequires
中,始终包括为构建 Python 软件包python3-devel
提供所需工具的条目,以及您打包的特定软件所需的相关项目,如python3-setuptools
或在%check
部分中运行测试所需的运行时和测试依赖项。- 4
- 当为二进制 RPM 选择名称(用户必须安装的软件包)时,请添加版本化的 Python 前缀。对默认的 Python 3.12 使用
python3-
前缀。您可以使用%{python3_pkgversion}
宏,对于默认的 Python 版本3.12
它评估为3
,除非您将其设置为一个显式版本,例如,当有较新版本的 Python 可用时(请参阅脚注 1)。 - 5
%py3_build
和%py3_install
宏会分别运行setup.py build
和setup.py install
命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。注意使用
setuptools
软件包中的setup.py build
和setup.py install
命令已弃用,并将在以后的主 RHEL 发行版本中删除。您可以改为使用 pyproject-rpm-macros 。- 6
%check
部分运行打包项目的测试。确切的命令取决于项目本身,但您可以使用%pytest
宏以一种 RPM 友好的方式运行pytest
命令。