根据要求从 RPM 添加模块

Add module from RPM as a requirement

所以我有这个项目有很多依赖项,这些依赖项正在从 pip 安装并记录在 requirements.txt 我现在需要添加另一个 pip 上不存在的依赖项,我将它作为某个地址中的 RPM。 根据要求安装它的最 Pythonic 方式是什么? 谢谢! 该代码将 运行 在 RHEL 和 Fedora

管理此类依赖关系的传统方法是使用配置管理系统,例如 SaltStack — I personally recommend it, since it is written in Python and can be extended with Python modules. Other choices include Puppet, Chef or Ansible

使用配置管理系统,您可以声明要在目标操作系统上安装和配置的包、配置文件和服务。然后,您 运行 代理,它会完成所有繁重的工作:复制文件、安装 RPM 包和 enabling/disabling 服务。优点是巨大的:您的 OS 配置被描述为代码,您总能获得可预测的结果并节省未来安装的时间。

请注意,使用 CM 会引入相当陡峭的学习曲线。但是,当您全神贯注于它时,您将永远不会回到手动进行 OS 配置。

更简单的方法是将必要的命令包装在 bash 脚本中,名称类似于 install_dependencies.sh。人们应该 运行 此脚本作为应用程序部署的一部分,因此最好在某处记录该过程。

在这种情况下,Pythonic 要做的事情就是如果无法满足依赖性则简单地失败。没关系,如果您的用户不满足安装的先决条件,他们会收到一个有用的错误提示。考虑许多 Python 具有 C 库依赖项的软件包,以便正确构建和安装。在您的项目中,仍然在 "setup.py" 和 "requirements.txt" 文件中声明所有 Python 依赖项,但是 Python 打包工具链中没有任何东西可以为您安装 RPM(也不应该!),所以如果没有安装 RPM,就停在那里让安装失败。

除此之外,您可能需要考虑将 Python 应用程序本身打包为 RPM。您有 RPM 依赖项,并且您的目标平台是 Fedora/RHEL。通过将您的应用程序打包为 RPM,您可以声明对其他 RPM 的依赖关系,这些 RPM 会自动安装那些所需的包。担心在 RPM 的构建阶段成为 Pythonic,并使用 RPM 魔术来完成其余的工作。

我建议不要使用配置管理工具(Puppet、Ansible 等),因为它们会使您的构建过程过于复杂。这些工具非常适合它们的预期用途,但在这里就像用大炮打苍蝇一样。

由于我们正在讨论选项 - 我将添加一个尚未讨论的选项。

Docker 个容器。

您可以安装一个包含您想要的 OS 的基础映像,然后 Docker 文件将安装您需要的所有依赖项。它还可以 pip 安装要求。

这可以使服务器清理不需要的任何安装,并且版本控制很容易,因为您将拥有一个带有新 code/dependencies 的新容器,而不会与旧版本重叠。