使用 rpmbuild 打包 Python 项目指南
在 RHEL、CentOS、Fedora 等基于 RPM 的 Linux 发行版中,将 Python 项目打包为 RPM 格式是进行系统级分发和管理的标准方式,随着 Python 生态的发展,现代的打包方式推荐使用 pyproject-rpm-macros,它能够更好地兼容 PEP 517/518 标准。
准备工作
在开始打包之前,你需要安装必要的构建工具和环境:
- 安装基础构建工具:
sudo dnf install rpm-build rpmdevtools python3-rpm-generators python3-pip
- 初始化 RPM 构建目录结构:
rpmdev-setuptree
执行后,会在用户主目录下生成
rpmbuild目录,包含SPECS,SOURCES,BUILD,RPMS,SRPMS等子目录。
核心概念:.spec 文件
.spec 文件是 rpmbuild 的核心,它定义了软件包的元数据、依赖关系以及构建和安装步骤,对于 Python 项目,现代 .spec 文件应利用宏来简化流程。
构建步骤
第一步:准备源代码
将你的 Python 项目代码(包含 pyproject.toml 或 setup.py)打包成 .tar.gz 文件,并放置到 ~/rpmbuild/SOURCES/ 目录下。
第二步:编写 .spec 文件
在 ~/rpmbuild/SPECS/ 目录下创建一个 .spec 文件(python-myapp.spec)。
以下是一个使用现代 Python 宏的模板:
Name: python-myapp
Version: 1.0.0
Release: 1%{?dist}
Summary: 示例 Python 项目
License: MIT
URL: https://example.com/myapp
Source0: %{name}-%{version}.tar.gz
BuildRequires: python3-devel
BuildRequires: python3-pip
BuildRequires: python3-setuptools
BuildRequires: python3-wheel
# 自动生成构建依赖
BuildRequires: pyproject-rpm-macros
%description
这是一个使用 rpmbuild 打包的 Python 示例项目。
%prep
%autosetup -n %{name}-%{version}
%build
# 构建 wheel
%pyproject_wheel
%install
# 安装 wheel
%pyproject_install
%files
%license LICENSE
%doc README.md
%{python3_sitelib}/myapp/
%{_bindir}/myapp-cli
%changelog
Mon Oct 23 2026 Your Name <you@example.com> - 1.0.0-1
- Initial package
关键宏说明
- %pyproject_wheel: 自动调用
pip wheel或构建后端来生成.whl文件。 - %pyproject_install: 自动将生成的
.whl文件安装到构建根目录中,并处理依赖关系。 - %{python3_sitelib}: 这是一个预定义的宏,指向 Python 3 的第三方库安装路径(通常是
/usr/lib/python3.x/site-packages)。
执行构建
在 SPECS 目录下运行以下命令开始构建:
rpmbuild -ba python-myapp.spec
- -ba: 表示构建二进制包(Binary)和源代码包(Source)。
- 构建完成后,生成的
.rpm文件位于~/rpmbuild/RPMS/目录下,生成的源代码包位于~/rpmbuild/SRPMS/目录下。
注意事项与最佳实践
- 依赖管理: 尽量使用
BuildRequires显式声明构建依赖,对于运行时的 Python 依赖,pyproject-rpm-macros通常会自动处理,但建议在安装后进行测试。 - 命名规范: RPM 包名应遵循
python3-<项目名>的命名规范。 - 避免打包虚拟环境: 不要将
venv或virtualenv打包进 RPM,RPM 应该安装到系统的 Python 路径中,或者使用python3-virtualenv宏进行隔离安装。 - 测试: 在构建完成后,务必在干净的容器或虚拟机中使用
dnf install ./path/to/package.rpm进行安装测试,确保所有依赖项都能正确解析。 - 安全性: 确保在
%install阶段正确处理文件权限,避免将敏感文件打包进去。
通过使用现代的 pyproject-rpm-macros,你可以极大地减少手动编写构建脚本的工作量,并确保打包过程符合当前的 Python 打包标准。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/488132.html
![[Kivy 打包环境配置]-把python打包成安卓应用就是如此的简单。 kivy打包opencv](https://i2.hdslb.com/bfs/archive/b034f0518a0015aa1c92c2bd21519290f681c878.jpg)


