使用RPM分发python包和模块依赖项

使用RPM分发python包和模块依赖项,python,virtualenv,packaging,rpm,buildout,Python,Virtualenv,Packaging,Rpm,Buildout,我有几个python应用程序,它们由脚本/模块组成,应该打包并作为RPM部署 更棘手的是,每个应用程序都应该与所有python模块依赖项一起分发,并且这些依赖项应该优先于系统范围内安装的任何应用程序 某些RPM的目标主机具有有限的网络访问权限,因此RPM应该包含运行应用程序所需的所有内容,而不是在部署时下载任何内容 我已经看过了包装和分发一个,但是重新定位一个virtualenv似乎没有得到很好的支持 我已经看过了,但发现缺少文档。我可以看到如何在开发过程中下载依赖项,但看不到如何将它们作为更大

我有几个python应用程序,它们由脚本/模块组成,应该打包并作为RPM部署

更棘手的是,每个应用程序都应该与所有python模块依赖项一起分发,并且这些依赖项应该优先于系统范围内安装的任何应用程序

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

我已经看过了包装和分发一个,但是重新定位一个virtualenv似乎没有得到很好的支持

我已经看过了,但发现缺少文档。我可以看到如何在开发过程中下载依赖项,但看不到如何将它们作为更大应用程序的一部分分发。不同的应用程序可能需要同一模块的不同版本,因此不应在系统范围内安装

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

有没有关于如何最好地实现这一目标的建议?从开发人员的角度来看,理想的工作流摘要如下所示:

  • 下载应用程序源代码
  • 如果不存在特定的模块依赖项,请运行脚本以获取该依赖项(可能使用)
  • 运行脚本构建python应用程序,并将其和所有下载的依赖项打包到RPM中

  • 最后的RPM应该可以在没有网络访问的主机上安装和运行,并且只安装了python解释器。

    我认为这是两个独立的问题

  • 您希望为开发人员提供一个可重复的安装/构建系统

  • 您需要一个安装程序生成器

  • Buildout(或pip,可能与额外的脚本结合使用)可以解决第一个问题。基本上是:“如何在一台全新的笔记本电脑上为项目开发做好准备”。理想情况下,您只需说
    python bootstrap.py;bin/buildout
    并准备就绪(与pip/virtualenv相同)

    现在您有了一个可重复的构建,可以将其作为安装程序的基础。Handiest是一个干净的虚拟机,您仅用于此目的。例如,Virtualbox/流浪者。制作脚本来设置virtualbox并在其中安装适当的依赖项

    然后,installer builder脚本可以在virtualbox中重新签出您的项目,并在您希望在安装程序中安装它的位置执行可重复的构建操作(
    /opt/yourproject

    然后使用生成实际的包(.deb、.rpm,随便什么)。传入FPM选项,告诉它必要的依赖项,这样您就可以始终确保安装了这些依赖项。(注意:这些是操作系统级的依赖项,如memcached或postgres;python依赖项应由pip或buildout处理)


    如果你把你的大问题分为这两个小问题,那么这两个问题都会受到单独的攻击。

    你可能会分发一个独立的python可执行文件——打包在RPM中?您是否需要源代码供用户使用?如果不是的话,看看这里,我没有用过它,但我的目标是处理像你这样的案件。查看此链接的“滚动您自己的软件包”部分。您应该使用pip捆绑包或pip“车轮罩”。FPM的一个问题是,不同的软件包(您要安装的)可能具有不同的依赖关系(例如,一个软件包需要requests 1.6,另一个软件包需要requests 2.1等),您无法表达这些差异,因为FPM将单个python包打包为RPM并安装(可以说是全局安装)。因此,最好将python项目及其依赖项作为单个RPM安装,如。