怎样将python程序及其依赖打包成rpm包部署

对于Python项目来说,一般会安装package名的目录和EGGINFO两个目录,将这两个目录连同里面所有的内容一起加入%files段就可以了。如果你要部署的是某个应用,一般你还会希望将init.d中的启动脚本、或者 systemd的配置文件以及其他应用的配置文件一起部署了,可以在install的过程中将这些文件从源文件目录中复...
怎样将python程序及其依赖打包成rpm包部署
可以的,虽然说pip比较流行,但rpm从原理上完全可以覆盖这些部署过程,只有一些小的要求:

所有环境的Python安装方式必须一致,不能存在某些Python是2.6,某些是2.7,某些装在/usr/local下面,某些在/usr/lib下面之类的情况
如果带有C扩展的话,链接到的库应当是来自某个rpm包的。如果没有的话就简单多了。
如果有依赖的其他Python包的话,需要把依赖的包也做成rpm;实在偷懒也可以打进同一个rpm中。

实际上发行版中有许多Python库都以rpm的形式提供,不过一般我们嫌它版本旧,更倾向于用pip管理一组新的。

要写一个rpm spec,可以从头自己写,也可以参考一些其他软件的spec,我建议你采用后者,既然你们公司已经广泛使用rpm了,那肯定有很多本公司的spec可以参考,也有人可以问。

回到话题,写rpm spec,或者说rpmbuild的过程,分成以下步骤:
部署源代码,一般来说将一个.tar.gz复制到SRC目录中,然后用%setup宏就可以了,这个宏也基本上没干什么特别的事,就是把.tar.gz解压缩了一下,然后进入相应目录。.tar.gz只要从git中取出干净的源代码,整个目录打成tar包就可以了。好像还有专门的git-archive命令。
build过程,对应C/C++项目中的./configure, make。对Python项目来说一般可以跳过,因为setup.py都会搞定。也可以选择在这个阶段使用setup.py进行build,build出一个wheel包来,这是我推荐的方法,因为wheel包和直接setup.py install的目录结构有一些差异,而pip安装默认是按照wheel的方式。也就是说在这一步调用:setup.py bdist_wheel。再精细一点可以指定build的目标为build目录,这样需要cleanup的时候容易一些。

install过程,对应C/C++项目中的make install。一般来说我们平时怎么装这个软件,这一步就怎么装,所以我们也是使用setup.py。唯一的技巧在于,我们需要指定安装的目标到rpmbuild根的某个目录下面,而不是系统的目录。这个目录在install开始之前应当被清空。可以参考其他spec。对于我们来说,就是将Python的库安装到指定的目录,而不是系统的site-packges当中。如果你在build这一步已经打包了wheel,那么使用wheel install命令、指定目标文件夹就可以了。
打包过程,rpm的打包原理非常简单,最开始install的目录是空的,install完成后里面有了一堆文件,那么就按照文件列表将这一堆文件打包、然后指定每个文件将来应当安装到什么位置。对于Python项目来说,一般会安装package名的目录和EGGINFO两个目录,将这两个目录连同里面所有的内容一起加入%files段就可以了。如果你要部署的是某个应用,一般你还会希望将init.d中的启动脚本、或者 systemd的配置文件以及其他应用的配置文件一起部署了,可以在install的过程中将这些文件从源文件目录中复制到目标文件夹里,然后加到files段里面。

安装、卸载脚本。表现为%pre, %post之类的段一般来说如果你有服务要安装的话,需要在这里使用chkconfig, chkconfig on,或者systemd的话就是systemctl enable。如果你希望安装完有个机会修改配置文件,可以选择在首次安装的时候不要启动服务,而在update的时候启动服务,这可以通过脚本传进的第一个命令行参数$1进行判断,0、1、2表示不同的情况(分别是卸载、安装、更新,具体的记不清了),可以参考其他人写的spec;也可以选择安装完永远直接启动,在post中使用service xxx start, 在preuninstall的时候使用service xxx stop。

rpm的功能还是很强大的,除了跟pip共通的功能以外,它有一个显著的好处就是可以帮助你同时管理服务的配置、启动和停止,从而简化部署过程。不过要注意如果使用rpm的话就不要同时使用pip,否则pip更新过的库,rpm卸载或更新时会冲突。

有第三方依赖的时候,一种方法是为每个依赖项写一个独立的spec,里面内容都是上面这样的直接调用setup.py,或者更简单一些,在install的时候直接调用pip就可以;然后在需要这些依赖项的rpm包的spec当中写上Require信息,跟pip体系的requirements差不多。偷懒也可以在同一个rpm中打了一堆Python包进去,但是如果有多个独立安装的rpm都打了同一个Python包,就会冲突,要注意。

其实用习惯了会觉得也不比pip差,需要跟非Python组件混合部署的时候反而会觉得简单了很多。2016-10-30
mengvlog 阅读 7 次 更新于 2025-07-19 10:20:08 我来答关注问题0
  •  翡希信息咨询 Python打包成exe的两种方法

    1. 使用PyInstaller 简介:PyInstaller是一个流行的打包工具,可以快速将Python程序及其依赖打包成一个独立的可执行文件。 特点: 编译速度快:相较于其他工具,PyInstaller的编译速度相对较快。 操作简便:通过简单的命令行参数即可实现打包,适合大多数场景。 执行原理:本质上调用Python执行py源码,...

  • 对于Python项目来说,一般会安装package名的目录和EGGINFO两个目录,将这两个目录连同里面所有的内容一起加入%files段就可以了。如果你要部署的是某个应用,一般你还会希望将init.d中的启动脚本、或者 systemd的配置文件以及其他应用的配置文件一起部署了,可以在install的过程中将这些文件从源文件目录中复...

  •  翡希信息咨询 一步一步地教你如何将Python程序打包成exe文件!赶紧进来学习吧!

    一、安装Pyinstaller模块 使用pip工具通过命令行安装Pyinstaller。命令为:pip install pyinstaller。二、准备Python程序 确保你的Python程序可以正常运行,并且所有依赖库都已正确安装。 将命令行路径切换至包含你的Python源文件的文件夹。三、执行打包操作 在命令行中运行Pyinstaller模块。通常的命令是:pyinstaller...

  •  翡希信息咨询 使用PyInstaller工具将Python程序打包成Mac可执行文件步骤

    命令如下:bashpip install pyinstaller2. 进入Python程序所在目录: 在终端中使用cd命令进入包含你要打包的Python程序的目录。3. 运行打包命令: 在终端中运行以下命令将Python程序打包成可执行文件:bashpyinstaller onefile program.py其中,program.py为你要打包的Python程序的文件名。onefile参数表示将所有依...

  •  阿暄生活 python程序执行原理 python程序的运行原理

    协程:协程是Python中一种更高级的并发编程模型,它允许单个线程内执行多个协程,从而实现并发执行。协程通过async和await关键字实现,适用于需要高效并发执行大量IO操作的场景。综上所述,Python程序的执行原理主要依赖于Python解释器将源代码转换成字节码并执行的过程。同时,Python提供了多种编程模式和并发编程...

檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部