4

我最近了解到,pip它不能以任何理智的方式解决传递依赖。这意味着在安装一个包之后,它的某些依赖项的依赖项可能实际上并没有得到满足。

有没有办法以编程方式检查所有已安装包的依赖项在安装后是否真正得到满足?

具体来说,我希望能够创建一个 virtualenv,将一些包安装到其中,然后验证所有安装的包是否确实具有所需的依赖项。


编辑:这是一个更好地说明问题的示例。假设 packageA依赖于 packagesBC,两者都依赖于 package D,可能具有不同的版本范围。安装时A,pip 会任意选择指定的版本范围之一D来满足。例如,可能满足B对的依赖D,但可能不满足对C所需的版本D。我想检测是否存在此类问题。

4

1 回答 1

0

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

import pip
import pkg_resources

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

ResolutionError如果任何已安装的软件包有不满足的要求,这将引发 a 。


旁白:这似乎是新pip check命令的目的,但它没有捕捉到上述脚本捕捉到的一些依赖问题,例如extras-related issues


更新:最新版本pip不提供get_installed_distributions()功能。根据https://github.com/pypa/pip/issues/5243pkg_resources.working_set可用于获取依赖列表:

import pkg_resources

pkg_resources.require(str(dep.as_requirement())
                      for dep in pkg_resources.working_set)
于 2016-12-24T08:52:57.113 回答