当您安装应用程序时,通常安装的是一个软件包,其中包含应用程序的可执行代码以及重要的文件,例如文档、图标等等。在 Linux 上,应用程序通常打包为 RPM 或 DEB 文件,用户使用 dnf
或 apt
命令安装它们,具体取决于 Linux 发行版。 但是,几乎每天都会发布新的 Python 模块,因此您很容易遇到尚未打包的模块。 这就是 pyp2rpm
命令存在的原因。
最近,我尝试安装一个名为 python-concentration 的模块。 它进展不顺利
$ sudo dnf install python-concentration
Updating Subscription Management repositories.
Last metadata expiration check: 1:23:32 ago on Sat 11 Jun 2022 06:37:25.
No match for argument: python-concentration
Error: Unable to find a match: python-concentration
它是一个 PyPi 包,但尚未作为 RPM 包提供。 好消息是,您可以使用 pyp2rpm
通过相对简单的过程自己构建 RPM。
您需要两个目录才能开始
$ mkdir rpmbuild
$ cd rpmbuild && mkdir SPECS
您还需要安装 pyp2rpm
$ sudo dnf install pyp2rpm
1. 生成 spec 文件
任何 RPM 包的基础都是一个名为spec 文件的文件。 此文件包含有关如何构建软件包的所有信息,它需要哪些依赖项,它提供的应用程序的版本,它安装哪些文件等等。 当指向 Python 模块时,pyp2rpm
会为其生成一个 spec 文件,您可以使用该文件来构建 RPM。
以 python-concentration 为例,以下是如何生成 spec 文件
$ pyp2rpm concentration > ~/rpmbuild/SPECS/concentration.spec
这是它生成的文件
# Created by pyp2rpm-3.3.8
%global pypi_name concentration
%global pypi_version 1.1.5
Name: python-%{pypi_name}
Version: %{pypi_version}
Release: 1%{?dist}
Summary: Get work done when you need to, goof off when you don't
License: None
URL: None
Source0: %{pypi_source}
BuildArch: noarch
BuildRequires: python3-devel
BuildRequires: python3dist(setuptools)
%description
Concentration [ >= 2.6.1 with python3dist(hug) < 3~~)
Requires: python3dist(setuptools)
%description -n python3-%{pypi_name}
Concentration [。
$ cd ~/rpmbuild
$ spectool -g -R SPEC/concentration.spec
Downloading: https://files.pythonhosted.org/...concentration-1.1.5.tar.gz
6.0 KiB / 6.0 KiB [=====================================]
Downloaded: concentration-1.1.5.tar.gz
-bs
选项代表构建源。 此选项为您提供一个 src.rpm
文件,这是一个必须为特定架构重建的通用包。
$ rpmbuild -bs SPECS/concentration.spec
Wrote: ~/rpmbuild/SRPMS/python-concentration-1.1.5-1.el9.src.rpm
为您的系统构建一个可安装的 RPM
$ rpmbuild --rebuild SRPMS/python-concentration-1.1.5-1.el9.src.rpm
error: Failed build dependencies:
python3-devel is needed by python-concentration-1.1.5-1.el9.noarch
看起来这个包需要 Python 的开发库。 安装它们以继续构建。 这次构建成功并呈现更多输出(我在此处为清楚起见进行了缩写)
$ sudo dnf install python3-devel -y
$ rpmbuild --rebuild SRPMS/python-concentration-1.1.5-1.el9.src.rpm
[...]
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.TYA7l2
+ umask 022
+ cd /home/bogus/rpmbuild/BUILD
+ rm -rf concentration-1.1.5
+ RPM_EC=0
++ jobs -p
+ exit 0
您的 RPM 包已在 RPMS 子目录中构建。 像往常一样使用 dnf
安装它
$ sudo dnf install RPMS/noarch/python3-concentration*rpm
为什么不直接使用 PyPi?
将 Python 模块制作成 RPM 并不是绝对必要的。 使用 PyPi 安装模块也是可以接受的,但 PyPi 会在您的个人检查和更新列表中添加另一个包管理器。 当您使用 dnf
安装 RPM 时,您将获得系统上安装的所有内容的完整列表。 感谢 pyp2rpm
,该过程快速、简单且可自动化。
6 条评论