Python应用程序的版本冲突,但不适用于交互式开发

Python应用程序的版本冲突,但不适用于交互式开发,python,pip,setuptools,pkg-resources,Python,Pip,Setuptools,Pkg Resources,我有一个包p,它依赖于包a。包A取决于包B和C==3。同时,包B取决于C==4 这会产生冲突,每次I pip安装包p或A时,akward错误消息都以红色显示 现在,我知道我可以运行包p和A,如果我将它们导入到交互式终端或Jupyter笔记本中,并调用所需的函数和类,我就可以运行它们。但是,包P有一个命令行应用程序,只要您继承了包a的安装冲突,就会出现错误 这个错误不是我提出的,它是由Python解释器单独提出的(我想),因为与我使用p作为库时相比,我没有调用任何新功能。事实上,我的CLI是一个由

我有一个包
p
,它依赖于包
a
。包
A
取决于包
B
C==3
。同时,包
B
取决于
C==4

这会产生冲突,每次I pip安装包
p
A
时,akward错误消息都以红色显示

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

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

错误跟踪最后显示了
pkg\u resources.ContextualVersionConflict
,我从未在
p
中调用过它

考虑到我只能控制包
p
中发生的事情,有没有办法让它直接作为命令行应用程序工作

我还想知道引擎盖下发生了什么

顺便说一句,我总是在一个新的康达环境中安装
p

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


谢谢

据我所知,B的版本不受A的约束,因此基本上任何版本的B都是可以接受的。现在,可能有一个版本的B在其依赖项中具有
C==3
。如果存在这样一个版本的B,假设它是
B==5
,那么下面的方法可能会起作用:

path/to/pythonX.Y -m pip install P B==5
如果它确实有效,对于长期解决方案,您可能希望尝试以下方法之一:

  • 在项目P上设置一个
    B==5
    约束,因为您可以控制它。我可能不会推荐它,因为B实际上不是P的直接依赖项
  • 使用一个包含
    B==5
    的函数调用pip:
    • path/to/pythonX.Y-m pip安装--constraint constraints.txt P

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

path/to/pythonX.Y -m pip --unstable-feature=resolver install P
有关详细信息,请参阅此答案:


我是否理解
A
的依赖性相互矛盾?
A
是公共项目吗?我想了解更多细节。
A
不是公共项目,但不在我的范围之内。
A
的依赖关系并不矛盾,但与
B
的依赖关系冲突。冲突只在一对可能决定不使用的函数中明显存在。对不起,我没有指定依赖项
B
只有一个可能的版本,那么
a
从一开始就无法工作,是吗。整个事情没有任何意义,或者我完全错过了一些东西如果我们从方程中排除
P
,是否有一个版本的
a
及其依赖项没有冲突?@sinroc
a
总是有冲突,但这并不意味着
a
不起作用。正如我所说的,如果我使用Python交互式会话,一切都会正常工作,但如果我从命令行运行脚本,一切都不会正常工作。