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 宏指定的软件包使用。