Red Hat Training

A Red Hat training course is available for RHEL 8

第 42 章 打包 Python 3 RPM

大多数 Python 项目都使用 Setuptools 进行打包,并在 setup.py 文件中定义软件包信息。有关 Setuptools 打包的详情请参考 Setuptools 文档

您还可以将 Python 项目打包到 RPM 软件包中,与 Setuptools 打包相比,它提供以下优点:

  • 在其它 RPM 上指定软件包的依赖关系(甚至非 Python)
  • 加密签名

    使用加密签名时,RPM 软件包的内容可与操作系统的其余部分一起验证、集成和测试。

42.1. Python 软件包的 SPEC 文件描述

SPEC 文件包含 rpmbuild 工具用来构建 RPM 的说明。这些说明包含在一系列部分中。SPEC 文件包含定义这些部分的两个主要部分:

  • 注释(包含一系列在正文中使用的元数据项)
  • 正文(包含指令的主要部分)

Python 项目的 RPM SPEC 文件与非 Python RPM SPEC 文件相比具有一些特殊性。最值得注意的是, Python 库的任何 RPM 软件包的名称必须始终包含决定这个版本的前缀,例如:对于 Python 3.6, python38 代表 Python 3.8,或 python39 用于 Python 3.9。python3

以下 SPEC 文件示例中显示了 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-develpython3-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 buildsetup.py install 命令,以及额外的参数来指定安装位置、要使用的解释器和其他详情。
6
check 部分提供了一个运行正确版本 Python 的宏。% {__python3} 宏包含 Python 3 解释器的路径,例如 /usr/bin/python3。我们建议总是使用宏而不是字面路径。

42.2. Python 3 RPM 的通用宏

在 SPEC 文件中,始终使用在以下 Macros for Python 3 RPMs 表中描述的宏,而不是硬编码其值。

在宏名称中,总是使用 python3 或者 python2 而不是未指定版本的 python。在 SPEC 文件的 BuildRequires 中将特定的 Python 3 版本配置为 python36-rpm-macrospython38-rpm-macrospython39-rpm-macros

表 42.1. Python 3 RPM 的宏

普通定义描述

%{__python3}

/usr/bin/python3

Python 3 解释器

%{python3_version}

3.6

Python 3 解释器的完整版本。

%{python3_sitelib}

/usr/lib/python3.6/site-packages

其中安装了 pure-Python 模块。

%{python3_sitearch}

/usr/lib64/python3.6/site-packages

其中安装包含特定架构扩展的模块。

%py3_build

 

使用适合系统软件包的参数运行 setup.py build 命令。

%py3_install

 

使用适合系统软件包的参数运行 setup.py install 命令。

42.3. 自动提供 Python RPM

当打包 Python 项目时,请确保在生成的 RPM 中包含以下目录(如果这些目录存在):

  • .dist-info
  • .egg-info
  • .egg-link

在这些目录中,RPM 构建过程会自动生成虚拟 pythonX.Ydist 提供,例如 python3.6dist(detox)。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。