5.5. 打包 Python 3 RPM
大多数 Python 项目使用 Setuptools 打包,并在 setup.py 文件中定义软件包信息。有关 Setuptools 打包的详情,请查看 Setuptools 文档。
您还可以将 Python 项目打包到 RPM 软件包中,它与 Setuptools 包装相比有以下优点:
- 有关软件包在其他 RPM 中的依赖软件包(甚至非 Python)
加密签名
通过加密签名,RPM 软件包的内容可以验证、集成并测试操作系统的其余部分。
5.5.1. Python 软件包的 spec 文件描述 复制链接链接已复制到粘贴板!
spec 文件包含 rpmbuild 实用程序用于构建 RPM 的说明。这些指令包含在不同的部分。spec 文件有两个主要部分来定义:
- Preamble(包含一系列在 Body 中使用的元数据项)
- Body(包含指令的主要部分)
与非 Python RPM SPEC 文件相比,Python 项目的 RPM SPEC 文件有一些特定信息。最值得注意的是,Python 库的任何 RPM 软件包的名称必须始终包含确定版本的前缀,例如: Python 3.6 的 python 3、Python 3.8 的 python38、Python 3.9 的 python39、Python 3.11 的 python3.11 或 Python 3.12 的 python3.12。
其他具体信息显示在 python3-detox 软件包的以下 spec 文件示例 中。有关此类特定描述,请查看示例中的备注。
- 1
- modname 宏包含 Python 项目的名称。在本例中,它是
detox。 - 2
- 将 Python 项目打包到 RPM 时,需要将
python3前缀添加到项目的原始名称。这里的原始名称为detox,RPM 的名称为python3-detox。 - 3
- BuildRequires 指定了构建和测试此软件包所需的软件包。在 BuildRequires 中,始终包括提供构建 Python 软件包所需的工具的项目:
python36-devel和python3-setuptools。需要python36-rpm-macros软件包,以便/usr/bin/python3解释器指令的文件会自动改为/usr/bin/python3.6。 - 4
- 每个 Python 软件包都需要一些其他软件包才能正常工作。这些软件包还需要在
spec文件中指定。要指定依赖项,您可以使用 %python_enable_dependency_generator 宏自动使用setup.py文件中定义的依赖项。如果软件包的依赖软件包没有使用 Setuptools 指定,请在附加Requires指令中指定它们。 - 5
- %py3_build 和 %py3_install 宏会分别运行
setup.py build和setup.py install命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。 - 6
- 检查 部分提供了运行正确 Python 版本的宏。%{__python3} 宏包含 Python 3 解释器的路径,如
/usr/bin/python3。我们建议始终使用宏而不是字面上的路径。
5.5.2. Python 3 RPM 的常见宏 复制链接链接已复制到粘贴板!
在 spec 文件中,始终使用用于 Python 3 RPM 的 Macros 的 Macros 表中的宏,而不是硬编码其值。
在宏名称中,总是使用 python3 或 python2,而不是未指定版本的 python。在 SPEC 文件的 BuildRequires 部分中,将特定的 Python 3 版本配置为 python36-rpm-macros,python38-rpm-macros,python39-rpm-macros,python3.11-rpm-macros, 或 python3.12-rpm-macros。
| Macro | 常规定义 | 描述 |
|---|---|---|
| %{__python3} | /usr/bin/python3 | Python 3 解释器 |
| %{python3_version} | 3.6 | Python 3 解释器的完整版本。 |
| %{python3_sitelib} | /usr/lib/python3.6/site-packages | 安装纯 Python 模块的位置。 |
| %{python3_sitearch} | /usr/lib64/python3.6/site-packages | 安装包含特定架构扩展的模块。 |
| %py3_build |
使用适合系统软件包的参数运行 | |
| %py3_install |
使用适合系统软件包的参数运行 |
5.5.3. 自动为 Python RPM 提供 复制链接链接已复制到粘贴板!
在打包 Python 项目时,请确保如果这些目录存在,请确保生成的 RPM 中包含以下目录:
-
.dist-info -
.egg-info -
.egg-link
从这些目录中,RPM 构建过程会自动生成虚拟 pythonX.Ydist,如 python3.6dist(detox)。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。