【问题标题】:Detect Python transitive dependency issues at install time?在安装时检测 Python 传递依赖问题?
【发布时间】:2017-05-09 10:45:06
【问题描述】:

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

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

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


编辑:这是一个更好地说明问题的示例。假设包A依赖包BC,这两个包都依赖包D,可能有不同的版本范围。在安装A时,pip会任意选择一个指定的版本范围给D来满足。例如,BD 的依赖可能得到满足,但CD 的所需版本可能不满足。我想检测是否存在此类问题。

【问题讨论】:

  • 是的,使用需求文件并固定您的版本号。
  • @BurhanKhalid 请参阅上述问题。我正在寻求一种“在安装时检测 Python 传递依赖问题”的方法。我不是在寻求一种避免传递依赖问题的方法,尤其是不是通过手动解决依赖关系。
  • 这个问题的新访客应该考虑使用诗歌python-poetry.org

标签: python python-2.7 pip setuptools transitive-dependency


【解决方案1】:

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

import pip
import pkg_resources

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

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


旁白:这似乎是新的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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2011-05-20
    • 2017-12-23
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多