使用RPM分发带有模块依赖的Python包

13

我有几个Python应用程序,由脚本/模块组成,应该被打包并部署为RPM。

较为复杂的是,每个应用程序都应与所有Python模块依赖项一起分发,并且这些应用程序应优先使用它们而不是安装在系统范围内的任何依赖项。

某些RPM的目标主机受到网络访问的限制,因此RPM应包含运行应用程序所需的所有内容,而不是在部署时下载任何内容。

我曾考虑过打包和分发virtualenv,但似乎不支持重新定位virtualenv。

我曾尝试使用zc.buildout,但发现文档缺乏。我可以看到如何在开发过程中下载依赖项,但不知道如何将它们作为更大应用程序的一部分进行分发。不同的应用程序可能需要相同模块的不同版本,因此这些模块不应安装在系统范围内。

另一个痛点是应用程序中的任何Python脚本需要修改以在开发期间和部署后使用不同的sys.path,我看不出明显的解决方法。

有关如何实现此目标的最佳建议是什么?开发人员角度的工作流程理想摘要如下:

  1. 下载应用程序源代码
  2. 运行脚本以获取特定模块依赖项(可能使用pip
  3. 运行脚本构建Python应用程序,并将其及所有已下载的依赖项打包成RPM

最终的RPM应该可以在只安装了Python解释器而没有网络访问权限的主机上进行安装和运行。


1
你可以分发一个独立的Python可执行文件 - 打包在RPM中?你需要让用户能够访问你的源代码吗?如果不需要,请看这里:https://dev59.com/PG035IYBdhLWcg3wYO51 - Anshul
1
我自己没有使用过,但是 conda 的目的是处理像你这样的情况。请查看此链接中的“滚动自己的软件包”部分。 - Shashank Agarwal
你应该使用pip捆绑包或pip“wheel houses”。 - ionelmc
1个回答

1

我认为这可以分为两个问题:

  1. 你需要一个可重复的安装/构建系统供开发人员使用。

  2. 你需要一个安装程序生成器。

Buildout(或pip,可能结合额外的脚本)可以解决第一个问题。基本上,它可以让"如何在新的笔记本电脑上准备项目以进行开发"变得简单:只需运行 python bootstrap.py;bin/buildout (使用pip/virtualenv同理)即可完成准备工作。

现在你拥有了可重复的构建过程,可以将其用作安装程序的基础。最方便的是使用干净的虚拟机来完成此操作,例如Virtualbox/vagrant。制作一些脚本,在其中设置虚拟机并安装所需的依赖项。

然后,安装程序生成器脚本可以在虚拟机内部进行新项目的检出,并在安装程序所需位置(例如/opt/yourproject)中执行可重复的构建过程。

然后使用FPM制作实际的软件包(.deb、.rpm等)。传递FPM选项,告诉它必要的依赖关系,这样您就可以始终确保这些依赖关系已安装。(注意:这些是操作系统级别的依赖项,如memcached或postgres;Python依赖项应由pip或buildout处理)。
如果将大问题分解为这两个较小的问题,则可以分别攻击它们。

1
FPM 的一个问题是,不同的软件包(您想要安装的)可能具有不同的依赖关系(例如,一个软件包需要 requests 1.6,另一个需要 requests 2.1 等),而您无法表达这些差异,因为 FPM 将打包单个 Python 软件包作为 RPM 并安装它(全局地,可以说)。因此,最好将 Python 项目及其依赖项作为单个 RPM 安装,例如 rpmvenv - miku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接