第 5 章 打包 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 打包标准。
5.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 前缀。将
python3-
前缀用于默认的 Python 3.12。您可以使用%{python3_pkgversion}
宏,它评估默认 Python 版本3.12
的3
,除非您将其设置为显式版本,例如,当有较新版本的 Python 可用时(请参阅 footnote 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
命令。