四步教你学会打包一个新的Python模块

目录
  • 1、生成 spec 文件
  • 2、运行 rpmlint
  • 3、下载源码
  • 4、构建源软件包
  • 为什么不使用 PyPi

当你安装一个应用程序时,你通常是在安装一个软件包,其中包含应用程序的可执行代码和重要文件,如文档、图标等。在 Linux上,软件一般被打包成 RPM 或 DEB 等格式,用户只要通过 ​ ​dnf​ ​​ 或者 ​ ​apt​ ​​ 等命令就可以进行安装了,这取决于你使用的 Linux 发行版。然而几乎每天都有新的 Python 模块发布,因此你很容易遇到一个尚未打包的 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 [![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

为了确保 spec 文件符合标准,你需要对文件使用 ​ ​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​ ​)需要记录日期。

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

再次运行 ​ ​rpmint​ ​:

$ 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​ ​ 来下载源码:

$ 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-build​ ​​ 包(或者在使用 ​ ​rpmbuild​ ​ 命令时根据终端的的提示进行安装)。

参数 ​ ​-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​ ​ 之后,这个过程就变得快速、简单且自动化了。

到此这篇关于四步教你学会打包一个新的Python模块的文章就介绍到这了,更多相关Python打包模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 打包发布Python模块的方法详解

    前言 昨天把自己的VASP文件处理库进行了打包并上传到PyPI,现在可以直接通过pip和easy_install来安装VASPy啦(同时欢迎使用VASP做计算化学的童鞋们加星和参与进来), VASPy的GotHub地址:https://github.com/PytLab/VASPy VASPy的PyPI地址:https://pypi.python.org/pypi/vaspy/ 由于自己的记性真是不咋地,怕时间久了就忘了,于是在这里趁热打铁以自己的VASPy程序为例对python的打包和上传进行

  • Python实现打包成库供别的模块调用

    1.创建python项目bricewulib 2.新建test_package包并创建info1类以及print_hello方法 3.为了让包的结构再复杂点,我们再在test_package下面新建一个test_package2包并创建Info2类以及print_hello2方法(注意:这里是Info2,不是上面的Info1) 4.此时整个test_package编写完成,目录结构(test_package包包含test_package2包以及info1类,test_package2包中又包含i

  • Python如何将模块打包并发布

    想要把自己开发的库分享给别人使用, 使用 pip install 命令来安装 , 需要学习如何制作一个python 安装包 一.注册pypi账号 https://pypi.org/account/register/ 二.创建setup.py和pypirc文件 setup.py模板(该文件放在项目根目录下) from os.path import abspath, dirname, join ​ from setuptools import setup, find\_packages ​ \# 获

  • python打包生成的exe文件运行时提示缺少模块的解决方法

    事情是这样的我用打包命令:pyinstaller -F E:\python\clpicdownload\mypython.py打包了一个exe程序,但是运行时提示我缺 少bs4模块然后我就去查pyinstaller的使用方法,找到pyinstaller有一个-p参数: 1.设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录. 2.也可以使用多个-p参数来设置多个导入路径 然后我找到bs4模块所在的目录E:\pyth

  • python中如何打包用户自定义模块

    假设需要打包的模块文件名为my.py,打包模块需要新建的一个脚本setip.py,然后在脚本下输入如下的内容: from disutils.core import setup setup{name = 'my',version = '1.0',py_modules = ['my']} 以管理员身份运行cmd,进入my.py的目录,执行下面的命令即可打包: python setup.py sdist 运行后在该目录下方出现一个文件夹dist,进入这个文件夹,会出现一个my-1.0.zip文件. 将

  • 四步教你学会打包一个新的Python模块

    目录 1.生成 spec 文件 2.运行 rpmlint 3.下载源码 4.构建源软件包 为什么不使用 PyPi 当你安装一个应用程序时,你通常是在安装一个软件包,其中包含应用程序的可执行代码和重要文件,如文档.图标等.在 Linux上,软件一般被打包成 RPM 或 DEB 等格式,用户只要通过 ​ ​dnf​ ​​ 或者 ​ ​apt​ ​​ 等命令就可以进行安装了,这取决于你使用的 Linux 发行版.然而几乎每天都有新的 Python 模块发布,因此你很容易遇到一个尚未打包的 Python

  • 5步教你快速写一个android Router路由框架

    Router路由框架 什么是路由?说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能. 前言 网上大片的路由框架实在太多了,实现的方式都大同小异,通过注解实现路由表:但是在多module开发的时候怎么合并路由表,不同的框架有着自己的解决方案. ARouter:通过类查找进行合并路由表. ActivityRouter:通过注解进行路由表合并. 路由框架的意义 Android系统已经给我们提供了api来做页面跳转,比如startActivity,为什么还需要路由框架呢?我们来简单分析下路

  • 手把手教你学会HBuilder打包APP

    我们打包APP需要用到HBuilder,所以先讲解如何安装使用 HBuilder的下载与安装 HBuilder的官网下载地址:https://www.dcloud.io/ 点击DOWNLOAD后会弹出如上显示的两种版本下载 Windows版 和 MacOS版 根据我们电脑版本下载即可,我们一定要下载标准版哦(正式版中的) 我这里是Windows系统,所以我选择的是window版 下载完是一个压缩包 右击压缩一下即可 打开文件夹后找到如下HBuilderX.exe文件 双击即可运行 为了方便我们可

  • 四步学会 Ajax

    复制代码 代码如下: //第一步 : 创建XMLHttpRequest对象 var http_request; try {     http_request = window.ActiveXObject("Microsoft.XMLHTTP"); }catch(e) {     try     {         http_request = new XMLHttpRequest();     }catch(e)     {         alert("你的浏览器不支持XM

  • 教你学会通过python的matplotlib库绘图

    一.前言 python的matplotlib库很强大可以绘制各种类型的图像. 首先要装一些基础的库,如numpy,matplotlib或是pandas. 二.基础命令 首先介绍绘图时常用的基础命令: 1.plt.plot(x,y)即为绘图命令. ①基础画图: plt.plot(x, y) ②设置颜色: color属性 如果没有特别要求的话可以不手动设置颜色,如果要在一张图上画不同的线时,会自动分配颜色.也可以使用ax.plot效果相同. plt.plot(x, y, color = 'red')

  • 一篇文章教你学会使用Python绘制甘特图

    目录 优点 局限 一日一书 用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project.GanttProject.WARCHART XGantt.jQuery.Gantt.Excel等,网络上也有一些优质工具支持在线绘制甘特图. 可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措.比如说,花里胡哨的UI,让人目不暇接,不知点哪个才好: 比如说,有些基于浏览器的图表需要掌握HTML.JS等编程语言,只会点Python的我直接被劝退: 再比如,进来就是注册.登

  • webpack如何打包一个按需引入的vue组件库

    目录 前言 在项目中使用vue组件库的一般姿势 webpack实现可按需引入的组件库 接下来就是使用webpack打包 调试组件库 npm 发布 步骤非常简单,只需4步 调试组件库按需引入 总结 前言 在公司里一般有多个相同技术栈的项目,毕竟在多个项目间copy公共组件代码太繁琐,也不利于组件库的维护,所以怎么高效维护一套公共的组件代码很重要.这种情况,一般我们可以考虑封装成组件库,发布到npm上.在每个项目里只需要npm install xxx 即可使用,避免了在项目间相互copy.我们这就开

  • 五步教你用Nginx部署Vue项目及解决动态路由刷新404问题

    目录 步骤一:改端口 步骤二: 打包 步骤三:将dist文件夹上传到服务器上 步骤四:修改nginx.conf(重中之重) 步骤五:重启nginx 总结 期末月前本来部署过一次,昨天部署的时候发现又给忘了,而且出了很多问题,在这统一汇总一下. 步骤一:改端口 在vue.config.js下的devServer把host改成服务器的地址 步骤二: 打包 用npm run build打包,最后是这样的,并且目录下多了个dist文件夹 步骤三:将dist文件夹上传到服务器上 我用的xshell,没办法

  • 四步轻松实现ajax发送异步请求

    ajax发送异步请求,供大家参考,具体内容如下 第一步(得到XMLHttpRequest) ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax!!! 1.得到XMLHttpRequest 大多数浏览器都支持:var xmlHttp=new XMLHttpRequest(); IE6.0:var xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); IE5.0以更早版本的IE:var xmlHttp=new A

  • 教你构建第一个Java Applet程序

    介绍 Note: 在你开始本教程之前,你必须下载downloaded 并安装installed Java SE Development Kit. Java applets像Java应用程序一样,它们的建立都是遵循相同的三个步骤-编写,编译及运行.不同 的是,它们是在一部分网页上运行,而不是在你的桌面上运行. 本文的主要目的是创建一个简单的Java applet. 为了达到这一点要遵循以下三个基本步骤: 1. 在Java中编写一个简单的applet 2. 编译Java源代码 3. 创建一个涉及到a

随机推荐