第 2 章 打包 Python 3 RPM


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

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

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

原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。历史上,大多数 Python 项目使用 distutilssetuptools 工具打包,并在 setup.py 文件中定义软件包信息。但是,创建原生 Python 软件包可能性随着时间而演变:

  • 要打包使用 setup.py 文件的 Python 软件,请按照本文档操作。
  • 要使用 pyproject.toml 文件打包更现代的软件包,请参阅 pyproject-rpm-macros 中的 README 文件。请注意,pyproject-rpm-macros 包含在 CodeReady Linux Builder (CRB)存储库中,其包含不受支持的软件包,并可能会随时间变化来支持较新的 Python 打包标准。

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

与非 Python RPM spec 文件相比,Python 项目的 RPM spec 文件有一些具体信息。

请注意,建议 Python 库的任何 RPM 软件包名称包含 python3- 前缀。

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

使用 Python 编写的 pello 程序的 SPEC 文件示例
%global python3_pkgversion 3                                          
1


Name:           python-pello                                          
2

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                     
3


# 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                         
4

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                                                            
5



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


%check                                                                
6

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

使用 setuptools 软件包中的 setup.py buildsetup.py install 命令已弃用,并将在以后的主 RHEL 发行版本中删除。您可以改为使用 pyproject-rpm-macros

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat