我有几个由脚本/模块组成的 python 应用程序,应该打包并部署为 RPM。
更棘手的一点是每个应用程序都应该与所有 python 模块依赖项一起分发,并且应该优先使用这些应用程序而不是系统范围内安装的任何应用程序。
其中一些 RPM 的目标主机具有有限的网络访问权限,因此 RPM 应包含运行应用程序所需的一切,而不是在部署时下载任何内容。
我看过包装和分发 virtualenv , 但似乎没有很好地支持重新定位 virtualenv。
我看过zc.buildout , 但发现缺少文档。我可以看到如何在开发过程中下载依赖项,但看不到如何将它们作为更大应用程序的一部分进行分发。不同的应用程序可能需要同一模块的不同版本,因此不应在系统范围内安装这些应用程序。
另一个痛点是应用程序中的任何 python 脚本都需要修改以在开发期间和部署后使用不同的 sys.path,我看不到明显的解决方法。
有关于如何最好地实现这一目标的建议吗?从开发人员的角度来看,理想的工作流程总结如下:
- 下载应用程序源
- 如果不存在则运行脚本来获取特定的模块依赖项(可能使用 pip )
- 运行脚本来构建 python 应用程序,并将它和所有下载的依赖项打包到 RPM 中
最终的 RPM 应该可以在没有网络访问权限的主机上安装和运行,并且只安装了 python 解释器。
最佳答案
我将其视为两个独立的问题。
您希望为您的开发人员提供可重复的安装/构建系统。
您需要一个安装程序生成器。
Buildout(或 pip,可能与额外的脚本结合使用)可以解决第一个问题。基本上是:“如何让项目准备好在新笔记本电脑上进行开发”。理想情况下,您只需说 python bootstrap.py;bin/buildout
并做好准备(与 pip/virtualenv 相同)。
现在您有了一个可重复的构建,您可以将其用作安装程序的基础。 Handiest 是专门用于此目的的干净虚拟机。例如,Virtualbox/vagrant。编写脚本来设置 virtualbox 并在其中安装适当的依赖项。
安装程序生成器脚本然后可以在 virtualbox 中重新 check out 您的项目,并在您希望在安装程序中拥有它的位置进行可重复的构建(/opt/yourproject
,例如)。
然后使用FPM制作实际的包(.deb、.rpm 等)。传入 FPM 选项,告诉它必要的依赖项,这样你就可以始终确保安装了这些依赖项。 (注意:这些是操作系统级别的依赖项,如 memcached 或 postgres;python 依赖项应由 pip 或 buildout 处理)。
如果您将大问题分解为这两个小问题,则可以分别攻击这两个问题。
关于python - 使用 RPM 分发 python 包以及模块依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109409/