16.4. 打包 Python 3 RPM
大多数 Python 项目使用 Setuptools 进行打包,并在 setup.py 文件中定义软件包信息。有关 Setuptools 打包的更多信息,请参阅 Setuptools 文档。
您还可以将 Python 项目打包成 RPM 软件包,与 Setuptools 打包相比有以下优点:
- 在其他 RPM (即使非 Python)上依赖关系软件包的规格
加密签名
通过加密签名,可以使用其余操作系统验证、集成和测试 RPM 软件包的内容。
16.4.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.9 的 、Python 3.11 的 python 39python3.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
- check 部分提供了一个宏,它运行正确的 Python 版本。%{__python3} 宏包含 Python 3 解释器的路径,例如
/usr/bin/python3。我们建议始终使用宏而不是字面上的路径。
16.4.2. Python 3 RPM 的常见宏 复制链接链接已复制到粘贴板!
在 spec 文件中,使用用于 Python 3 RPM 的宏表中的内容来使用宏而不是使用硬编码。
在宏名称中,始终使用 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 |
使用适合系统软件包的参数运行 |
16.4.3. 自动为 Python RPM 提供 复制链接链接已复制到粘贴板!
在打包 Python 项目时,请确保以下目录包含在生成的 RPM 中(如果这些目录存在):
-
.dist-info -
.egg-info -
.egg-link
从这些目录中,RPM 构建流程自动生成虚拟 pythonX.Ydist 提供,如 python3.6dist (detox)。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。