第 2 章 打包 Python 3 RPM
您可以使用 DNF 软件包管理器在系统上安装 Python 软件包。DNF 使用 RPM 软件包格式,它提供更多的对软件的下游控制。
与原生 Python 软件包相比,将 Python 项目打包到 RPM 软件包中具有以下优势:
- 可以对 Python 和非 Python 软件包的依赖项,并严格由 DNF 软件包管理器强制执行。
- 您可以用加密的方式为软件包签名。使用加密签名,您可以将操作系统的其余部分与 RPM 软件包的内容进行验证、集成和测试。
- 您可以在构建过程中执行测试。
原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。历史上,大多数 Python 项目使用 distutils 或 setuptools 工具打包,并在 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
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/
- 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 build和setup.py install命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。注意使用
setuptools软件包中的setup.py build和setup.py install命令已弃用,并将在以后的主 RHEL 发行版本中删除。您可以改为使用 pyproject-rpm-macros 。- 6
%check部分运行打包项目的测试。确切的命令取决于项目本身,但您可以使用%pytest宏以一种 RPM 友好的方式运行pytest命令。