5.5. 打包 Python 3 RPM
您可以使用 pip
安装程序,或使用 DNF 软件包管理器在系统中安装 Python 软件包。DNF 使用 RPM 软件包格式,它提供了更好的软件下游控制。
原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。大多数 Python 项目使用 distutils
或 setuptools
实用程序进行打包,并在 setup.py
文件中定义的软件包信息。然而,创建原生 Python 软件包可能会随着时间而有新的演变。有关新兴打包标准的更多信息,请参阅 pyproject-rpm-macros。
本章论述了如何将 setup.py
的 Python 项目打包到一个 RPM 软件包中。与原生 Python 软件包相比,此方法提供以下优点:
-
可以对 Python 和非 Python 软件包的依赖项,并严格由
DNF
软件包管理器强制执行。 - 您可以用加密的方式为软件包签名。使用加密签名,您可以验证、集成和测试 RPM 软件包的内容与操作系统的其余部分。
- 您可以在构建过程中执行测试。
5.5.1. SPEC 文件是 Python 软件包的描述
SPEC 文件包含 rpmbuild
实用程序用于构建 RPM 的指令。这些指令包含在不同的部分。SPEC 文件有两个主要部分用于定义构建指令:
- Preamble(包含一系列在 Body 中使用的元数据项)
- Body(包含指令的主要部分)
与非 Python RPM SPEC 文件相比,Python 项目的 RPM SPEC 文件有一些特定信息。
Python 库的任何 RPM 软件包的名称必须始终包括 python3-
或 python3.11-
前缀。
以下 SPEC 文件示例中显示了 python3*-pello
软件包的其他具体信息。有关此类特定描述,请查看示例中的备注。
使用 Python 编写的 pello 程序的 SPEC 文件示例
%global python3_pkgversion 3.11 1 Name: python-pello 2 Version: 1.0.2 Release: 1%{?dist} Summary: Example Python library License: MIT URL: https://github.com/fedora-python/Pello Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz BuildArch: noarch BuildRequires: python%{python3_pkgversion}-devel 3 # Build dependencies needed to be specified manually BuildRequires: python%{python3_pkgversion}-setuptools # Test dependencies needed to be specified manually # Also runtime dependencies need to be BuildRequired manually to run tests during build BuildRequires: python%{python3_pkgversion}-pytest >= 3 %global _description %{expand: Pello is an example package with an executable that prints Hello World! on the command line.} %description %_description %package -n python%{python3_pkgversion}-pello 4 Summary: %{summary} %description -n python%{python3_pkgversion}-pello %_description %prep %autosetup -p1 -n Pello-%{version} %build # The macro only supported projects with setup.py %py3_build 5 %install # The macro only supported projects with setup.py %py3_install %check 6 %{pytest} # Note that there is no %%files section for the unversioned python module %files -n python%{python3_pkgversion}-pello %doc README.md %license LICENSE.txt %{_bindir}/pello_greeting # The library files needed to be listed manually %{python3_sitelib}/pello/ # The metadata files needed to be listed manually %{python3_sitelib}/Pello-*.egg-info/
- 1
- 通过定义
python3_pkgversion
宏,您可以设置将为哪个 Python 版本构建此软件包。要为默认的 Python 版本 3.9 构建,请将宏设置为默认值3
或完全删除行。 - 2
- 将 Python 项目打包到 RPM 中时,需要将
python-
前缀添加到项目的原始名称中。此处的原始名称为pello
,因此 源 RPM (SRPM)的名称 是python-pello
。 - 3
- BuildRequires 指定了构建和测试此软件包所需的软件包。在 BuildRequires 中,始终包括为构建 Python 软件包提供所需工具的项:
python3-devel
(或python3.11-devel
)以及软件包的特定软件所需的相关项目,如python3-setuptools
(或python3.11-setuptools
)或在 %check 部分运行测试所需的运行时和测试依赖项。 - 4
- 当为二进制 RPM 选择名称(用户必须安装的软件包)时,请添加版本化的 Python 前缀。将
python3-
前缀用于默认的 Python 3.9 或 Python 3.11 的python3.11-
前缀。您可以使用%{python3_pkgversion}
宏,它针对默认的 Python 版本 3.9 评估为3
,除非您将其设置为显式版本,例如3.11
(请参阅脚注 1)。 - 5
- %py3_build 和 %py3_install 宏会分别运行
setup.py build
和setup.py install
命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。 - 6
- %check 部分应该运行打包项目的测试。确切的命令取决于项目本身,但可以使用 %pytest 宏,以 RPM 友好的方式运行
pytest
命令。
5.5.2. Python 3 RPM 的常见宏
在 SPEC 文件中,使用用于 Python 3 RPM 的宏表中的内容来使用宏而不是使用硬编码。您可以通过在 SPEC 文件之上定义 python3_pkgversion
宏来重新定义在这些宏中使用哪个 Python 3 版本(请参阅 第 5.5.1 节 “SPEC 文件是 Python 软件包的描述”)。如果您定义了 python3_pkgversion
宏,则下表中描述的宏的值将反映指定的 Python 3 版本。
表 5.3. Python 3 RPM 宏
Macro | 常规定义 | 描述 |
---|---|---|
%{python3_pkgversion} | 3 |
所有其他宏使用的 Python 版本。可被重新定义为 |
%{python3} | /usr/bin/python3 | Python 3 解释器 |
%{python3_version} | 3.9 | Python 3 解释器的 major.minor 版本 |
%{python3_sitelib} | /usr/lib/python3.9/site-packages | 安装纯 Python 模块的位置 |
%{python3_sitearch} | /usr/lib64/python3.9/site-packages | 安装包含特定于架构扩展模块的模块的位置 |
%py3_build |
使用适用于 RPM 软件包的参数运行 | |
%py3_install |
使用适用于 RPM 软件包的参数运行 | |
%{py3_shebang_flags} | s |
Python 解释器指令宏的默认标记集, |
%py3_shebang_fix |
将 Python 解释器指令改为 |
其他资源
5.5.3. 为 Python RPM 使用自动生成的依赖项
以下流程描述了如何在将 Python 项目打包为 RPM 时使用自动生成的依赖项。
先决条件
- RPM 的 SPEC 文件存在。如需更多信息,请参阅 Python 软件包的 SPEC 文件描述。
流程
确保以下包含上游提供元数据的目录之一包含在生成的 RPM 中:
-
.dist-info
.egg-info
RPM 构建过程会自动从这些目录中生成虚拟
pythonX.Ydist
,例如:python3.9dist(pello)
然后,Python 依赖项生成器读取上游元数据,并使用生成的
pythonX.Ydist
虚拟提供为每个 RPM 软件包生成运行时要求。例如,生成的要求标签可能如下所示:Requires: python3.9dist(requests)
-
- 检查生成的要求。
要删除其中的一些生成的需要,请使用以下方法之一:
-
在 SPEC 文件的
%prep
部分中修改上游提供的元数据。 - 使用上游文档中描述的依赖项自动过滤。
-
在 SPEC 文件的
-
要禁用自动依赖项生成器,请在主软件包的
%description
声明中包含%{?python_disable_dependency_generator}
宏。
其他资源