【问题标题】:Add module from RPM as a requirement根据要求从 RPM 添加模块
【发布时间】:2017-05-12 13:29:32
【问题描述】:

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

【问题讨论】:

  • 通过subprocesssetup.py 运行yum 快速肮脏的黑客攻击,如果yum 失败或未找到,则会引发异常并显示相应的错误消息。
  • @NizamMohamed - “setup.py”应该知道 Python 依赖项,而不是 RPM。您的上述建议将是非常糟糕的做法。
  • @alex setup.py 是一个可以运行任何python代码的python脚本。 distutils 已被非标准库setuptools 增强。谁来定义什么是不好的做法?
  • @NizamMohamed - 通过向“setup.py”添加调用 yum 的子进程,您将 (1) 使您的 Python 项目平台特定于 Fedora/RHEL,(2) 需要 root 权限才能运行任何setup.py 命令和 (3) 您的建议为 setup.py 增加了相当大的复杂性,只是为了生成一条错误消息。请记住,在 setup.py 中声明一个普通的 Python 依赖项将导致如果该依赖项无法满足,则生成一条错误消息,无论该依赖项是否必须通过 PIP 或 RPM 安装。
  • @alex 如果需要 (1) 使用 platform 模块并采取相应措施 (2) 使用 sudo 提示 (3) 我说这是一个 hack!

标签: python pip fedora requirements.txt


【解决方案1】:

在这种情况下,如果无法满足依赖关系,Pythonic 的做法就是简单地失败。没关系,如果您的用户不满足安装的先决条件,他们会欣赏一个有用的错误。考虑一下大量带有 C 库依赖项的 Python 包,以便正确构建和安装。在您的项目中,仍然在“setup.py”和“requirements.txt”文件中声明所有 Python 依赖项,但 Python 打包工具链中没有任何内容可以为您安装 RPM(也不应该!),所以只需如果没有安装 RPM,请停在那里,让安装失败。

除此之外,您可能还需要考虑将 Python 应用程序本身打包为 RPM。你有 RPM 依赖,你的目标平台是 Fedora/RHEL。通过将您的应用程序打包为 RPM,您可以声明对其他 RPM 的依赖关系,从而自动安装这些所需的包。不必担心在 RPM 的构建阶段是 Pythonic,然后使用 RPM 魔法来完成剩下的工作。

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

【讨论】:

  • 感谢您的提示!看看我如何解决这个问题
  • “如果没有安装 RPM,就停在那里,让安装失败”,如果没有安装 RPM,如何从setup.py 检查?
  • @Nizam 如果安装了 RPM,您不会从“setup.py”检查。它应该只检查 Python 包依赖项,而不是 RPM。
【解决方案2】:

管理此类依赖项的常规方法是使用配置管理系统,例如SaltStack — 我个人推荐它,因为它是用 Python 编写的,并且可以使用 Python 模块进行扩展。其他选择包括PuppetChefAnsible

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

请注意,使用 CM 会引入相当陡峭的学习曲线。但是,当您仔细考虑它时,您将永远不会回到手动进行操作系统配置。

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

【讨论】:

    【解决方案3】:

    既然我们正在讨论选项 - 我将提出一个尚未讨论过的选项。

    Docker 容器。

    您可以使用您想要的操作系统安装一个基础镜像,然后 Docker 文件将安装您需要的所有依赖项。它还可以 pip install 要求。

    这可以使服务器清除不需要的任何安装,并且版本控制很容易,因为您只需拥有一个带有新代码/依赖项的新容器,而不会与旧版本重叠。

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 2010-12-08
      • 2013-01-04
      • 2016-02-03
      • 1970-01-01
      • 2022-11-29
      • 2012-01-30
      • 2020-06-21
      相关资源
      最近更新 更多