19.4. 打包 Python 3 RPM
大多数 Python 项目使用 Setuptools 进行打包,并在 setup.py
文件中定义软件包信息。有关 Setuptools 打包的更多信息,请参阅 Setuptools 文档。
您还可以将 Python 项目打包成 RPM 软件包,与 Setuptools 打包相比有以下优点:
- 在其他 RPM (即使非 Python)上依赖关系软件包的规格
加密签名
通过加密签名,可以使用其余操作系统验证、集成和测试 RPM 软件包的内容。
19.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.8 的 python38
、Python 3.9 的 python39
、Python 3.11 的 python3.11
或 Python 3.12 的 python3.12
。
其他具体信息显示在 python3-detox
软件包的以下 spec
文件示例 中。有关此类特定描述,请查看示例中的备注。
%global modname detox 1 Name: python3-detox 2 Version: 0.12 Release: 4%{?dist} Summary: Distributing activities of the tox tool License: MIT URL: https://pypi.io/project/detox Source0: https://pypi.io/packages/source/d/%{modname}/%{modname}-%{version}.tar.gz BuildArch: noarch BuildRequires: python36-devel 3 BuildRequires: python3-setuptools BuildRequires: python36-rpm-macros BuildRequires: python3-six BuildRequires: python3-tox BuildRequires: python3-py BuildRequires: python3-eventlet %?python_enable_dependency_generator 4 %description Detox is the distributed version of the tox python testing tool. It makes efficient use of multiple CPUs by running all possible activities in parallel. Detox has the same options and configuration that tox has, so after installation you can run it in the same way and with the same options that you use for tox. $ detox %prep %autosetup -n %{modname}-%{version} %build %py3_build 5 %install %py3_install %check %{__python3} setup.py test 6 %files -n python3-%{modname} %doc CHANGELOG %license LICENSE %{_bindir}/detox %{python3_sitelib}/%{modname}/ %{python3_sitelib}/%{modname}-%{version}* %changelog ...
- 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
。我们建议您使用宏而不是字面路径。
19.4.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 |
使用适合系统软件包的参数运行 |
19.4.3. 自动为 Python RPM 提供
在打包 Python 项目时,请确保以下目录包含在生成的 RPM 中(如果这些目录存在):
-
.dist-info
-
.egg-info
-
.egg-link
从这些目录中,RPM 构建流程自动生成虚拟 pythonX.Ydist
提供,如 python3.6dist (detox)
。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。