2

我有一个P依赖于一个包的包A。包A取决于包BC==3. 同时,PackageB依赖于C==4.

这会产生冲突,并且每次我 pip install packagesPA.

现在,我知道我可以运行包PA如果我将它们导入交互式终端或 Jupyter 笔记本并调用我需要的函数和类就可以了。但是, packageP有一个命令行应用程序,只要您有从 package 继承的安装冲突,就会引发错误A

这个错误不是我提出的,它是由 Python 解释器单独提出的(我认为),因为与我P用作库时相比,我没有调用任何新功能。事实上,我的 CLI 是一个由 包裹的类fire,我可以在交互式会话中毫无问题地调用它。

错误跟踪显示pkg_resources.ContextualVersionConflict在最后,我从不调用P.

鉴于我只能控制 package 中发生的事情P,有没有办法让它直接作为命令行应用程序工作?

我也很想知道幕后发生了什么。

顺便说一句,我总是 P在新的 Conda 环境中安装。

对于包B,只有一个版本可用,而不是多个版本。

谢谢!

4

1 回答 1

0

据我了解,B的版本不受A 的限制,因此基本上任何版本的B都是可以接受的。现在,也许有一个版本的B包含C==3在它的依赖项中。如果存在这样的B版本,假设它是B==5,那么以下可能有效:

path/to/pythonX.Y -m pip install P B==5

如果它确实有效,对于长期解决方案,您可能需要尝试以下方法之一:

  • B==5对您的项目P设置约束,因为您可以控制它。不过我可能不会推荐它,因为B实际上并不是P的直接依赖项。
  • 使用包含并使用以下选项调用pip的constraints.txt文件B==5--constraint
    • path/to/pythonX.Y -m pip install --constraint constraints.txt P

另外,我建议尝试pip的新的实验性依赖解析器。在这种情况下,找到合适的组合或安装项目可能会更好。

path/to/pythonX.Y -m pip --unstable-feature=resolver install P

有关详细信息,请参阅此答案:

于 2020-07-19T17:26:03.977 回答