Red Hat Training

A Red Hat training course is available for RHEL 8

第 40 章 打包 Python 3 RPM

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

您还可以将 Python 项目打包成 RPM 软件包,与 Setuptools 打包相比有以下优点:

  • 在其他 RPM (即使非 Python)上依赖关系软件包的规格
  • 加密签名

    通过加密签名,可以使用其余操作系统验证、集成和测试 RPM 软件包的内容。

40.1. SPEC 文件是 Python 软件包的描述

SPEC 文件包含 rpmbuild 实用程序用于构建 RPM 的指令。这些指令包含在不同的部分。SPEC 文件有两个主要部分用于定义构建指令:

  • Preamble(包含一系列在 Body 中使用的元数据项)
  • Body(包含指令的主要部分)

与非 Python RPM SPEC 文件相比,Python 项目的 RPM SPEC 文件有一些特定信息。最值得注意的是,Python 库的任何 RPM 软件包的名称必须总是包括确定版本的前缀,例如: Python 3.6 的 python3,Python 3.8 的 python38 或 Python 3.9 的 python39

其他具体信息显示在 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 前缀始终需要添加到项目的原始名称中。此处的原始名称为 detoxRPM 名称为 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。我们建议您使用宏而不是字面路径。