在安装时检测Python的传递依赖问题?

7 浏览
0 Comments

在安装时检测Python的传递依赖问题?

最近我发现pip无法合理地解析传递依赖关系。这意味着在安装一些包之后,它的某些依赖关系可能实际上并没有被满足。

是否有一种方法可以在安装后以编程方式检查所有已安装包的依赖关系是否被满足?

具体而言,我希望能够创建一个虚拟环境,在其中安装一些包,然后验证所有已安装包是否实际上具有所需的依赖关系。


编辑:这里有一个示例更好地说明了问题。假设包A依赖于包BC,它们都依赖于包D,可能具有不同的版本范围。在安装A时,pip会任意选择一个指定的版本范围来满足D。例如,BD的依赖可能已经被满足,但CD的要求可能无法被满足。我想检测是否存在这样的问题。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这个答案展示了如何获取所有本地安装的包。这个答案展示了一种验证给定包是否已安装的方法,它还会递归检查包的依赖关系。结合这些:

import pip
import pkg_resources
pkg_resources.require(str(dep.as_requirement())
                      for dep in pip.get_installed_distributions())

如果任何已安装的包存在未满足的要求,这会引发一个ResolutionError


插曲:这似乎是新的pip check命令的目的,但是它无法捕捉到上述脚本捕捉到的一些依赖关系问题,例如额外相关的问题


更新:最近的pip版本不再提供get_installed_distributions()函数。根据https://github.com/pypa/pip/issues/5243,可以使用pkg_resources.working_set来获取依赖关系列表:

import pkg_resources
pkg_resources.require(str(dep.as_requirement())
                      for dep in pkg_resources.working_set)

0