Menu Close
Settings Close

Language and Page Formatting Options

第 3 章 打包 Python 3 RPM

您可以使用 pip 安装程序,或使用 DNF 软件包管理器在系统中安装 Python 软件包。DNF 使用 RPM 软件包格式,它提供了更好的软件下游控制。

原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。大多数 Python 项目使用 distutilssetuptools 实用程序进行打包,并在 setup.py 文件中定义的软件包信息。然而,创建原生 Python 软件包可能会随着时间而有新的演变。有关新兴打包标准的更多信息,请参阅 pyproject-rpm-macros

本章论述了如何将 setup.py 的 Python 项目打包到一个 RPM 软件包中。与原生 Python 软件包相比,此方法提供以下优点:

  • 可以对 Python 和非 Python 软件包的依赖项,并严格由 DNF 软件包管理器强制执行。
  • 您可以用加密的方式为软件包签名。使用加密签名,您可以验证、集成和测试 RPM 软件包的内容与操作系统的其余部分。
  • 您可以在构建过程中执行测试。

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

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

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

与非 Python RPM SPEC 文件相比,Python 项目的 RPM SPEC 文件有一些特定信息。

重要

Python 库的任何 RPM 软件包的名称需要包含 python3- 前缀。

其他具体信息可在以下 适用于 python3-pello 软件包的 SPEC 文件示例中显示。有关此类特定描述,请查看示例中的备注。

Name:           python-pello                                          1
Version:        1.0.2
Release:        1%{?dist}
Summary:        Example Python library

License:        MIT
URL:            https://github.com/fedora-python/Pello
Source:         %{url}/archive/v%{version}/Pello-%{version}.tar.gz

BuildArch:      noarch
BuildRequires:  python3-devel                                         2

# Build dependencies needed to be specified manually
BuildRequires:  python3-setuptools

# Test dependencies needed to be specified manually
# Also runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires:  python3-pytest >= 3


%global _description %{expand:
Pello is an example package with an executable that prints Hello World! on the command line.}

%description %_description

%package -n python3-pello                                             3
Summary:        %{summary}

%description -n python3-pello %_description


%prep
%autosetup -p1 -n Pello-%{version}


%build
# The macro only supported projects with setup.py
%py3_build                                                            4


%install
# The macro only supported projects with setup.py
%py3_install


%check                                                                5
%{pytest}


# Note that there is no %%files section for the unversioned python module
%files -n python3-pello
%doc README.md
%license LICENSE.txt
%{_bindir}/pello_greeting

# The library files needed to be listed manually
%{python3_sitelib}/pello/

# The metadata files needed to be listed manually
%{python3_sitelib}/Pello-*.egg-info/
1
将 Python 项目打包到 RPM 中时,需要将 python- 前缀添加到项目的原始名称中。这里的原始名称为 pello,因此 源 RPM(SRPM) 的名称python-pello
2
BuildRequires 指定了构建和测试此软件包所需的软件包。在 BuildRequires 中,需要包括提供构建 Python 软件包所需工具的项目: python3-devel 以及您的软件包所需的相关项目,如 python3-setuptools 或在 %check 部分中包括运行测试所需的运行时和测试依赖关系。
3
当为二进制 RPM 选择名称(用户安装软件包时使用的名称)时,添加版本化的 Python 前缀,当前为 python3-。因此,生成的二进制 RPM 将命名为 python3-pello
4
%py3_build%py3_install 宏会分别运行 setup.py buildsetup.py install 命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。
5
%check 部分应该运行打包项目的测试。确切的命令取决于项目本身,但可以使用 %pytest 宏以 RPM 友好的方式运行 pytest 命令。%{python3} 宏包含 Python 3 解释器的路径,即 /usr/bin/python3。我们建议使用宏,而不是使用路径。