第 2 章 打包 Python 3 RPM


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

与原生 Python 软件包相比,将 Python 项目打包到 RPM 软件包中具有以下优势:

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

原生 Python 软件包的打包格式遵循 Python 打包授权(PyPA)发布的规格。历史上,大多数 Python 项目使用 distutilssetuptools 工具打包,并在 setup.py 文件中定义软件包信息。但是,创建原生 Python 软件包的选项随着时间而演变:

  • 要打包使用 setup.py 文件的 Python 软件,请按照本文档操作。
  • 要使用 pyproject.toml 文件打包更现代的软件包,请阅读 pyproject-rpm-macros 源中的 README 文件。pyproject-rpm-macros 软件包位于 CodeReady Linux Builder (CRB)存储库中。该仓库包含不受支持的软件包。根据需要,pyproject-rpm-macros 内容更改,以支持较新的 Python 打包标准。有关 PyPA 规格和 pyproject-rpm-macros 存储库的链接,请参阅附加资源。

2.1. 示例 Python 软件包的 spec 文件描述

参阅以下 python3-pello 软件包示例中有关 Python RPM spec 文件的备注。

与非 Python RPM spec 文件相比,Python 项目的 RPM spec 文件有一些具体信息。例如,建议任何 Python 库的 RPM 软件包名称包含 python3- 前缀。

例 2.1. 使用 Python 编写的程序的 SPEC 文件示例

%global python3_pkgversion 3

Name:           python-pello
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:  python%{python3_pkgversion}-devel

# Build dependencies need to be specified manually
BuildRequires:  python%{python3_pkgversion}-setuptools

# Test dependencies need to be specified manually
# Runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires:  python%{python3_pkgversion}-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 python%{python3_pkgversion}-pello
Summary:        %{summary}

%description -n python%{python3_pkgversion}-pello %_description


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


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


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


%check
%pytest


# Note that there is no %%files section for python-pello
%files -n python%{python3_pkgversion}-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/
  • 通过定义 python3_pkgversion 宏,您可以设置将为哪个 Python 版本构建此软件包。要为默认的 Python 版本 3.12 进行构建,请删除该行。
  • 将 Python 项目打包到 RPM 中时,需要将 python- 前缀添加到项目的原始名称中。这里的项目名称是 Pello,因此源 RPM (SRPM)的名称是 python-pello
  • BuildRequires 指定了构建和测试此软件包所需的软件包。在 BuildRequires 中,始终包含 python3-devel 和其他构建 Python 软件包的工具。另外,列出软件所需的项目,如 python3-setuptools。在 %check 部分中添加需要运行测试的任何运行时和测试依赖项。
  • 当为二进制 RPM 选择名称(用户必须安装的软件包)时,请添加版本化的 Python 前缀。对默认的 Python 3.12 使用 python3- 前缀。您可以使用 %{python3_pkgversion} 宏,对于默认的 Python 版本 3.12 它评估为 3,除非您将其设置为一个显式版本,例如,当有较新版本的 Python 可用时(请参阅脚注 1)。
  • %py3_build%py3_install 宏会分别运行 setup.py buildsetup.py install 命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。

    注意

    使用 setuptools 软件包中的 setup.py buildsetup.py install 命令已弃用。在后续的 Red Hat Enterprise Linux 版本中不支持这些命令。您可以改为使用 pyproject-rpm-macros

  • %check 部分运行打包项目的测试。确切的命令取决于项目本身,但您可以使用 %pytest 宏以一种 RPM 友好的方式运行 pytest 命令。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部