python项目使用setuptools和rpmbuild构建rpm包

article/2025/10/16 9:00:23

python项目使用setuptools和rpmbuild构建rpm包

文章目录

    • python项目使用setuptools和rpmbuild构建rpm包
      • 一、setuptools
      • 二、使用rpmbuild,编写.spec文件构建rpm包
      • 三、使用pyinstaller
      • 四、参考文献:

一、setuptools

作为 Python 标准的打包及分发工具,setuptools 可以说相当地简单易用。它会随着 Python 一起安装在你的机器上。你只需写一个简短的 setup.py 安装文件,就可以将你的 Python 应用打包。

1、setuptools的关键就是setup.py的编写了,这是我的setuptools使用的一些配置。

import setuptoolsdesktop_path = '/usr/share/applications/'
icon_path = '/usr/share/icons/hicolor/scalable/apps/'setuptools.setup(name='pw-policy',version='1.0',description='pam config tool',author='',author_email='',url='',packages=['pw'],#启用清单文件MANIFEST.ininclude_package_data=True,#install_requires=['PyQt5'],entry_points={'console_scripts':['pw_policy = pw.pam_main:run']},data_files=[(desktop_path,['pw/pw-policy.desktop']),(icon_path,['pw/pw-policy.png']),],
)

只列举几个重点吧:

(1)packages=[‘’]

​ 需要处理的包目录(包含__init__.py的文件夹),这里通常使用 find_packages(),它默认在和setup.py同一目录下搜索各个含有 __init__.py的目录。

​ 但我没用到find_packages(),项目比较简单,直接写了我py文件在的目录名。

(2)include_package_data=True,

​ 功能为引入非 Python 文件。默认情况下只会对 Python 源码进行打包,但是如果我们想要将其他静态文件,例如 css 文件,或是 qt 的一些 ui 文件打包进去,就需要使用这个参数。

​ 在setup.py同一目录下建一个清单文件MANIFEST.in,在清单文件中列出想引入的非py文件的目录,该目录下的所有非py文件都会被引入。

(3)entry_points 可以用来创建控制台脚本。我们看上面的例子就会非常好理解:

entry_points = {'console_scripts': ['test = test.help:main']
}

这样在安装完毕之后,我们可以直接在控制台输入 test,这样是可以运行 test.help 模块下的 main 函数。就把test放在了/usr/bin/目录下。

(4) data_files=[ ],

​ 看到有这样描述:如果数据文件存在于项目外,则可以使用 data_files 参数或者 MANIFEST.in 文件进行管理。如果用于源码包,则使用 MANIFEST.in;如果用于 wheel,则使用 data_files。 data_files=[(‘mydata’, [‘data/conf.yml’])]即为上述设置将在打包 wheel 时,将 data/conf.yml 文件添加至 mydata 目录。

​ 在之后打包rpm时,data_files参数和MANIFEST.in 文件都起作用了。我这里是要把应用放到桌面,所以要创建.desktop文件放到/usr/share/applications/,应用图标放到/usr/share/icons/hicolor/scalable/apps/。这个路径什么时候起作用?

.desktop文件可以百度下,关键在参数Exec= ,表示程序执行路径。

2、之后执行编译(本质上是新建了一个build目录,而后将指定的packages列表包下的所有".py"文件和MANIFEST.in 文件指定目录下的所有非py文件拷贝过去),同时生成.egg-info文件夹,存放打包中间结果。

python setup.py build

3、打包操作,文件名为 应用名-版本号.tar.gz。也是保存在 dist 文件夹下。

python setup.py sdist --formats=gztar

有了上面的 setup.py 文件,我们就可以打出各种安装包,主要分为两类:sdist 和 bdist。

bdist可打包whl和egg格式、rpm包、windows下的安装包。

4、之后可以安装:下面的安装命令会将当前的 Python 应用安装到当前 Python 环境的 site-packages 目录下,这样其他程序就可以像导入标准库一样导入该应用的代码了

pip install dist/devops-0.1.1.tar.gz

或不打包直接

python setup.py install

这里我们如果想要删除安装的包,可以使用 pip uninstall xxx 来完成删除。

二、使用rpmbuild,编写.spec文件构建rpm包

为什么还要用这种方式构建rpm包。

原生 Python 软件包的打包格式由 Python Packaging Authority (PyPA) 规范定义。大多数 Python 项目使用 distutilssetuptools 实用程序进行打包,并在 setup.py 文件中定义的软件包信息。然而,创建原生 Python 软件包可能会随着时间而有新的演变。有关新兴打包标准的更多信息,请参阅 pyproject-rpm-macros。

本章论述了如何将 setup.py 的 Python 项目打包到一个 RPM 软件包中。与原生 Python 软件包相比,此方法提供以下优点:

  • 可以对 Python 和非 Python 软件包的依赖项,并严格由 DNF 软件包管理器强制执行。
  • 您可以用加密的方式为软件包签名。使用加密签名,您可以验证、集成和测试 RPM 软件包的内容与操作系统的其余部分。
  • 您可以在构建过程中执行测试。

1、安装rpmbuild及生成相关目录

yum install rpmdevtools
yum install -y rpm-build
rpmdev-setuptree

–BUILD #编译之前,如解压包后存放的路径
–BUILDROOT #编译后存放的路径
–RPMS #打包完成后rpm包存放的路径
–SOURCES #源包所放置的路径
–SPECS #spec文档放置的路径
–SPRMS #源码rpm包放置的路径

2、源码打包放入SOURCES 。编写spec文件,我的.spec文件

Name:               pw-policy
Version:            1.0
Release:            1
Summary:            A pam config tool
License:            MulanPSL-2.0
URL:                ??
Source0:            %{name}-%{version}.tar.gz
BuildArch:          noarchBuildRequires:      python3-devel python3-setuptools
Requires:           python3 python3-PyQt5-base%description
A pam config tool%prep
%autosetup  -p1 -n %{name}-%{version}%build
%py3_build%install
%py3_install%files
%{_bindir}/pw_policy
%{_datadir}/icons/hicolor/scalable/apps/pw-policy.png
%{_datadir}/applications/pw-policy.desktop
%{python3_sitelib}/pw/
%{python3_sitelib}/pw_policy-*.egg-info/%changelog
* ???
- Package init

主要参考Redhat官方文档第 3 章 打包 Python 3 RPM中给的spec和写好setup.py的python项目,非常棒。

文档没提到的点:

  1. BuildArch: noarch

    noarch表示你的应用会独立于操作系统架构

  2. 个人觉得spec后面就是对源码的一系列操作、

    %prep
    %autosetup -p1 -n %{name}-%{version}就是解压源码压缩包

  3. %build
    %py3_build

    %install

    %py3_install

    %py3_build%py3_install 宏会分别运行 setup.py buildsetup.py install 命令。

  4. %files

    指明哪些需要打包。打包.desktop和图标文件,%{python3_sitelib}中python包文件,

    pw_policy在/usr/bin中,也要打包。

3、.spec文件写完,打包:

rpmbuild -ba SPECS/xxx.spec

构建时无python3-devel:yum install python3-devel

进入 RPMS就可以发现rpm包了。

4、安装rpm包

rpm -qpi xxx.rpm查看包信息rpm -ivh xxx.rpm安装

5、效果

在这里插入图片描述

三、使用pyinstaller

1、pyinstaller介绍

pyinstaller可以把python项目打包为windows的exe、macos的包和linux下的各种包(Ubuntu的deb,Redhat的rpm,Arch的pacman)。

使用PyInstaller会将应用程序与相关数据文件绑定到Linux可执行文件中。此绑定过程的输出是一个文件夹。制作Linux下的包,还需要fpm工具

windows下制作Windows installer,还需要工具InstallForge 。

2、pyinstaller输出可执行文件

简单地使用demo

pyinstaller --add-data "penguin.svg:." --name "hello-world" app.py

–add-data:数据文件,如图标,css、qss文件等。可以多次使用。注意格式

–name:应用名字

-F:会输出一个文件,但打开时间会变慢

pyinstaller输出dist文件夹、build文件夹和一个.spec文件。

dist文件夹中包含可执行文件,build文件夹中为构建过程中的文件,.spec是这次构建生成后记录的配置文件。

3、使用fpm打rpm包,并实现桌面应用

之后按文档使用fpm可以进一步打包成各种Linux包,可以看教程。fpm和sepc是两个构建rpm包的方式。

前面使用pyinstaller生成的可执行文件和用fpm打包为rpm形成桌面应用,都可以成功。

4、使用spec打rpm包

但当我使用spec构建时,编写如下spec:

%global     debug_package %{nil}AutoReqProv:        no
Name:               pw-policy
Version:            1.0
Release:            1
Summary:            A pam config tool
License:            MulanPSL-2.0
URL:                ??
Source0:            %{name}.tar
BuildRequires:      python3 python-pip%description
A pam config tool%prep
%setup  -c -n %{name}-%{version}%build
%py3_build
python3 -m pip install pyinstallerpyinstaller --add-data "./pw-policy.png:." --add-data "./pw-policy.qss:." --name "pw-policy" ./pam_main.py %install
%{__mkdir_p} %{buildroot}/opt
%{__mkdir_p} %{buildroot}%{_datadir}/applications/
%{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/scalable/appscp -r ./dist/pw-policy %{buildroot}/optinstall -m 644 ./pw-policy.png  %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/
install -m 644 ./pw-policy.desktop %{buildroot}%{_datadir}/applications/%files
%{_datadir}/icons/hicolor/scalable/apps/pw-policy.png
%{_datadir}/applications/pw-policy.desktop
/opt/pw-policy/%changelog
* ???
- Package init

rpmbuild 打包rpmbuild -ba SPECS/xxx.spec能成功,但pyinstaller输出的dist文件夹中可执行文件一直报某个模块找不到,发现网上很多人用pyinstaller在很多情况下都有遇到某个模块找不到的情况。可以使用–hidden-import 找不到的模块,但我第一个模块找不到时成功了,第二个模块再用–hidden-import便不成功。遂使用了setuptools配合spec文件打包。

四、参考文献:

  1. Redhat官方setuptools加spec打包rpm。第 3 章 打包 Python 3 RPM

  2. setuptool教程:

    Python的打包工具(setup.py)实战篇https://www.cnblogs.com/yinzhengjie/p/14124623.html

    Python打包之setuptoolshttps://www.cnblogs.com/Zzbj/p/11535625.html

    Python 打包分发工具 setuptools 简介https://mathpretty.com/13655.html#%E5%AE%89%E8%A3%85%E5%BA%94%E7%94%A8

  3. spec教程:

    使用spec与fpm 2种方式进行rpm打包https://developer.aliyun.com/article/417304

    How to create an RPM package/zh-cnhttps://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA_.spec_%E6%96%87%E4%BB%B6

  4. pyinstaller

    Packaging PyQt5 applications for Linux with PyInstaller & fpmhttps://www.pythonguis.com/tutorials/packaging-pyqt5-applications-linux-pyinstaller/

How to create an RPM package/zh-cnhttps://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA_.spec_%E6%96%87%E4%BB%B6

  1. pyinstaller

    Packaging PyQt5 applications for Linux with PyInstaller & fpmhttps://www.pythonguis.com/tutorials/packaging-pyqt5-applications-linux-pyinstaller/


http://chatgpt.dhexx.cn/article/AK6q6aFt.shtml

相关文章

rpm(基本命令、Makefile、建立rpmbuild编包)

文章目录 一、rpm基本命令介绍1.安装软件2、升级软件3、查询软件包的详细信息4、查询某个文件是属于那个rpm包的5、查该软件包所包含的文件6、查看软件包所依赖的软件7、查看某个包是否被安装8、卸载 二、rpm命令实践三、把c语言程序和makefile内容,编译情况和执行情…

rpmbuild制作rpm 包

什么是rpm包? rpm 相当于windows中的安装文件,它会自动处理软件包之间的依赖关系。 rpm优点: 包管理系统简单,通过几个命令就可以实现包的安装、升级、卸载。 安装速度比源码包快的多。缺点: 经过编译&#xff0c…

项目打包rpm包(rpmbuild)

这里以python项目为例,通过rpmbuild工具打包成rpm包,并进行安装验证 rpmbuild打包 rpm流程 构建rpmbuild打包目录 rpmbuild 默认变量配置文件 将我们的python项目和依赖包压缩成xx.tar.gz格式,并copy到SOURCE目录 我们这里以datalake-demo…

前向星和链式前向星

链接:https://blog.csdn.net/ACdreamers/article/details/16902023 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的…

关于链式前向星

最近看了许多题目都用了比较奇怪的东西… 后面才发现是神奇的链式前向星….. 听名字就觉得很牛啊! 然而其实很简单…… 组成:begin,next,to,w,与一个用来标记的e begin[n]数组:代表编号为n的点,最后一条边的储存位置 next[n]:是用来保存从同一个点…

链式前向星(加快图的搜索)

存储一个图通常有两种方式:邻接矩阵和邻接表。如果一个图中的边非常少,那么邻接矩阵就比较稀疏,浪费空间,如果点非常多,则矩阵的内存有可能会爆掉。用向量实现的邻接表在点非常多的时候同样比较慢,在一些题…

链式前向星存储图

第七天链式前向星存图 图片如下所示 本代码存的是有向图&#xff0c;图示为无向图。 #include<iostream> using namespace std; const int maxn 100; struct node//to 边的终点编号&#xff0c;w 权值&#xff0c; next 以 x 为起点的上一条边的编号 {int to,w,next;…

链式前向星存图 详细解析

文章目录 链式前向星完整代码 链式前向星 链式前向星是一种图的存储方式&#xff0c;相比于 邻接矩阵和邻接表 &#xff0c;链式前向星是一种静态链表存储&#xff0c;用边集数组和邻接表相结合&#xff0c;可以快速访问一个顶点的所有邻接点。 在某些算法题中使用还很频繁&a…

C++之链式前向星

链式前向星 基本定义以及实现链式前向星实现DFSBFS 基本定义以及实现 (若果有一定了解&#xff0c;可以跳过第一部分&#xff0c;直接看第二部分) 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按…

图的存储 —— 链式前向星

图的存储 —— 链式前向星 链式前向星采用了一种静态链表存储方式&#xff0c;将边集数组和邻接表相结合&#xff0c;可以快速访问一个节点的所有邻接点&#xff0c;在算法竞赛中被广泛应用。 链式前向星有如下两种存储结构。 边集数组&#xff1a;edge[]&#xff0c;edge[i…

简述链式前向星

一、前言 我们常见的存图数据结构有两种&#xff0c;一种是邻接矩阵&#xff0c;另一种是邻接表。而在邻接矩阵中&#xff0c;空间复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;在稀疏图的情况下&#xff0c;相较于邻接表浪费了许多空间。而常规的邻接表是用链表进行操作&…

链式前向星 详解

链式前向星 链式前向星是一种类似于邻接表的存图方式&#xff0c;同样适用于有向 图和无向图。 他建立的是边与边之间的联系 它将边里的所有边都进行编号 int cnt; //边的编号 struct edge{ //边的结构体int from,to,w,next; //from是边的起点&#xff08;这个可有可无&a…

用链式前向星存储图

图最常用的存储结构主要是邻接矩阵和邻接表。当顶点数太大时&#xff0c;用二维数组表示的邻接矩阵可能超内存&#xff08;MLE&#xff09;&#xff0c;而用邻接表的编码工作量较大&#xff0c;此时&#xff0c;使用vector数组或链式前向星模拟邻接表是不错的选择。因vector数组…

链表、链式前向星

讲链表的时候就卡在这里了&#xff0c;最短路又卡在链式前向星上了&#xff0c;毕竟是图论基础&#xff0c;觉得还是有必要写一写防止下次再懵。 链表都是头插法&#xff01;&#xff01;即每次我们给他插一个头。 普通链表 先初始化令head-1,idx-1. void add_tohead(int x…

链式前向星(详细讲述)

在dalao的压迫下本蒟蒻发个博客&#xff0c;给大家讲一下链式前向星&#xff08;新手&#xff0c;写错了轻喷&#xff09; 首先说明一点链式前向星适合于稀疏图&#xff0c;而邻接矩阵则更适合稠密图&#xff0c;所以最好看好数据范围再决策使用哪个方法&#xff0c;当然有些题…

链式前向星与邻接表对比

本文图片及数据 对于这样一张有向图&#xff1a; 输入边的顺序如下&#xff1a; 1 2 2 3 3 4 1 3 4 1 1 5 4 5 对于邻接表来说是这样的&#xff1a; 1 -> 2 -> 3 -> 5 2 -> 3 3 -> 4 4 -> 1 -> 5 5 ->^ 对于链式前向星来说是这样的&…

链式前向星存图(有图详解)

链式前向星:既然是链式那么肯定和链表相关,前向星是每次指向都向前 链式前向星存图是以边为中心,并不是以结点为中心,它记录的是边的一些属性,包括边边的id、头节点、尾结点、权值、边的指向! 边的指向是遍历图的时候需要按照一定顺序去遍历,而不能胡乱的去遍历,那么就需要这些…

链式前向星的详解

目录 1&#xff1a;链式前向星的概念解释 2&#xff1a;代码展现 链式前向星是一种非常好用的有向图存储方式&#xff0c;但是它的代码难度却有点大。作者在这上面花了很长的时间才弄懂。虽然有其他的博客大佬写的很好&#xff0c;但总感觉不太适合小白选手&#xff08;比如说…

链式前向星基本原理

一、概述 我们在学习图论的时候学习了一种图的存储结构--二维数组邻接矩阵储存&#xff0c;他虽然可以表达直观&#xff0c;快速访问连接两点的边&#xff0c;但是它占用空间大&#xff0c;只适用于点少的图&#xff0c;所以我们需要一种能够可以存储大型图的东西--链式前向星…

链式前向星的原理图解

笔者写下这篇文章的契机是&#xff0c;前两天在上机课用纯链式存储写题&#xff0c;累的够呛。于是痛定思痛&#xff0c;在此梳理一遍链式前向星&#xff0c;也希望能给有同样困扰的同学们提供一点帮助。 在进入正题之前&#xff0c;我们先用邻接矩阵和邻接表引入。 邻接矩阵表…