什么情况下可以 pip “发现” yum 所做的包更新

什么情况下可以 pip “发现” yum 所做的包更新

远程站点的某些节点存在问题,这些节点在之前使用 pip 的 SLES 系统上安装了多个 Python RPM。尽管我们已经指导远程团队不要将两者混合使用,并且他们现在也遵循此指导,但仍然有一些机器被“混合”。

在站点的某些(但不是全部)计算机上,运行“pip list”表明 pip 已发现较新的软件包。 Pip 在此过程中进行了更新(通过 RPM),但它的安装顺序与所有节点上的其他 Python 包相同,但没有相同的行为。因此,由于较新的软件包导致不兼容,我们的一些脚本现在无法正常运行。

该站点的节点之间肯定会存在一些差异,但总的来说,它们尽可能保持接近相同。有谁知道 Python 包的 yum 安装如何更新 pip 数据库?

答案1

有谁知道 Python 包的 yum 安装如何更新 pip 数据库?

为此,pip 并没有真正拥有与 Python 本身分开的数据库。安装软件包时,关联的名称<package>.egg-info会放置在软件包本身旁边。这是 core-python 而不是pipor yum。因此,当您询问 pip 那里有什么时,它只会查找这些egg-info元文件并使用这些文件来通知它已安装的内容。例如:/usr/lib/python3/dist-packages在ubuntu上。

当您要求 yum 安装 python 软件包时,RPM 应该附带这些相同的egg-info文件。

Pip 的部分工作是在安装时检查 python 环境中的依赖关系。如果 yum 破坏了依赖关系,那么这将会被发现(正如您所发现的)。它通过检查文件中的元数据来做到这一点egg-info

Yum 还尝试检查依赖性。但有一个很大的问题。 Yum 实际上并不知道实际安装了哪些 python 库。它只知道安装了哪些 RPM。因此,任何不使用 yum 或其他 RPM 安装的 python 软件包都不会被 yum 发现。


这确实是创建虚拟环境的目的。将应用程序环境绑定到系统环境通常不是一个好主意。很少有好的方法可以使您的应用程序需求与操作系统保持一致。


什么情况下可以 pip “发现” yum 所做的包更新

如果 yum 已将软件包安装到同一环境中,则 pip 应该能够发现它们。两个主要例外可能是:

  • 如果您要将软件包安装到虚拟环境中。除非特别要求,虚拟环境不会继承系统包。即使环境确实继承了它们,它也始终会首先使用它自己的本地安装。

  • 如果 pip 将软件包安装到用户而不是系统。同样,这些软件包不会被 yum 覆盖,并且 python 通常会使用为用户安装的软件包(在/home/...为系统安装的软件包下)。

其中第二个很可能是机器之间差异的根源。 可能会安装到可能为系统安装的pip install用户。sudo pip install

相关内容