打包Python模块的4个步骤

打包Python模块的4个步骤


发布日期: 2022-09-06 更新日期: 2022-09-06 编辑:xuzhiping 浏览次数: 1379

标签:

摘要: pyp2rpm 命令可以创建 RPM 软件包并自动执行该过程。安装应用程序时,通常安装的软件包包含应用程序的可执行代码和重要文件,如文档、图标等。在 Linux上,应用程序通常打包为 RPM 或 DEB 文件,用户使用 dnf 或 apt 命令安装,这具体...

Python

pyp2rpm 命令可以创建 RPM 软件包并自动执行该过程。安装应用程序时,通常安装的软件包包含应用程序的可执行代码和重要文件,如文档、图标等。在 Linux上,应用程序通常打包为 RPM 或 DEB 文件,用户使用 dnfapt 命令安装,这具体取决于 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 为其生成一个规范文件,可使用该文件构建 RPM。

利用 python-concentration 作为任意示例,以下是如何生成规范的文件:

$ 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 [![PyPI version]( [![Test Status]( [![Lint Status]( [![codecov](

%package -n     python3-%{pypi_name}
Summary:        %{summary}
%{?python_provide:%python_provide python3-%{pypi_name}}

Requires:       (python3dist(hug) >= 2.6.1 with python3dist(hug) < 3~~)
Requires:       python3dist(setuptools)
%description -n python3-%{pypi_name}
Concentration [![PyPI version]( [![Test Status]( [![Lint Status]( [![codecov](


%prep
%autosetup -n %{pypi_name}-%{pypi_version}

%build
%py3_build

%install
%py3_install

%files -n python3-%{pypi_name}
%license LICENSE
%doc README.md
%{_bindir}/concentration
%{python3_sitelib}/%{pypi_name}
%{python3_sitelib}/%{pypi_name}-%{pypi_version}-py%{python3_version}.egg-info

%changelog
*  - 1.1.5-1
- Initial package.

2.运行rpmlint

要确保规范文件符合标准,请对该文件运行 rpmlint 命令:

$ rpmlint ~/rpmbuild/SPEC/concentration.spec
error: bad date in %changelog: - 1.1.5-1
0 packages and 1 specfiles checked; 0 errors, 0 warnings.

更改日志条目似乎需要日期:

%changelog
* Sat Jun 11 2022 Tux <tux@example.com> - 1.1.5-1

请重新运行 rpmlint 命令:

$ rpmlint ~/rpmbuild/SPEC/concentration.spec
0 packages and 1 specfiles checked; 0 errors, 0 warnings.

此时可看到运行成功。

3.下载源代码

要构建 RPM 软件包,需要下载正在打包的代码。实现这一点的简单方法是解析 spec 文件以找到源代码在互联网上的位置。

首先,使用 dnf 安装 spectool 命令:

$ sudo dnf install spectool

在某些发行版中,spectool 均在 rpmdevtools 软件包中分发,并用其来下载源代码:

$ 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

这将创建一个 SOURCES 目录并将源代码存档放入其中。

4.构建源码包

具备有效的 spec 文件后,即可使用 rpmbuild 命令构建源代码包。若还未安装 rpmbuild,请使用 dnf 安装 rpm 构建包(或者在尝试使用 rpmbuild 命令时接受终端的建议安装包)。

$ 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 的出现令此过程更加快速、简单且自动化。

相关推荐

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org