如何使用pipenv解决Python包依赖性问题?

Val*_*the 18 python dependencies pip python-3.x pipenv

pipenv用来处理Python包依赖项.

Python包使用两个包(命名pckg1pckg2),这些包依赖于相同的包命名pckg3,但是来自两个不同的版本.显示依赖项树:

$ pipenv graph
  pckg1==3.0.0
    - pckg3 [required: >=4.1.0]
  pckg2==1.0.2
    - pckg3 [required: ==4.0.11]
Run Code Online (Sandbox Code Playgroud)

尝试安装依赖项:

$ pipenv install

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches pckg3==4.0.11,==4.1.0,>=4.1.0 (from -r C:\Users\user\AppData\Local\Temp\pipenv-o7uxm080-requirements\pipenv-hwekv7dc-constraints.txt (line 2))
Tried: 3.3.1, 3.3.2, 3.3.3, 3.4.0, 3.4.2, 4.0.0, 4.0.0, 4.0.1, 4.0.1, 4.0.2, 4.0.2, 4.0.3, 4.0.3, 4.0.4, 4.0.4, 4.0.6, 4.0.6, 4.0.8, 4.0.8, 4.0.9, 4.0.9, 4.0.10, 4.0.10, 4.0.11, 4.0.11, 4.1.0, 4.1.0, 4.1.1, 4.1.1, 4.1.2, 4.1.2, 4.2.1, 4.2.1, 4.3.0, 4.3.0
There are incompatible versions in the resolved dependencies.
Run Code Online (Sandbox Code Playgroud)

正如所建议的,pip install --skip-lock诀窍,但依赖树仍未解决.

我想告诉Pipenv覆盖pckg2的要求,并指明pckg3>=4.1.0.

怎么解决?

Har*_*oli 8

我总是遇到那个错误。每次清除锁定文件中的缓存都是很不错的选择。

$ pipenv lock --pre --clear

  • 这很有帮助,但我必须在没有 `--pre` 的情况下执行此操作,否则我会遇到其他不匹配错误。 (4认同)

hoe*_*ing 6

你不能 目前,pipenv没有提供任何东西来明确覆盖需求约束。

解决方法是,您可以将要覆盖的依赖项放到,dev-packages因为它们将被覆盖packages,因此Pipfile应安装pckg3>=4.1.0

# Pipfile
...
[packages]
pckg1 = "==3.0.0"

[dev-packages]
pckg2 = "==1.0.2"
Run Code Online (Sandbox Code Playgroud)

如果现在锁定并安装:

$ pipenv lock --dev
$ pipenv install --dev
Run Code Online (Sandbox Code Playgroud)

该要求==4.0.11将被覆盖>=4.1.0。如果您问我这是丑陋的,因为这不是开发包的目的,并且您正在更改pckg2项目中依赖项的角色,但是我看不到任何更好的方法。

  • 我同意这很糟糕(在答案中提到过),但恐怕`pipenv` 的当前开发状态​​没有其他可用的选项...... (2认同)

小智 5

当 pipfile 上有未完成的例程时,此方法有效。

一旦我犯了错误并逃跑

pipenv install codecove # With an 'e' at the end
Run Code Online (Sandbox Code Playgroud)

而且 Pipenv 总是试图完成安装但没有成功,因为该库不存在。我用以下方法解决了它:

pipenv uninstall codecove
Run Code Online (Sandbox Code Playgroud)

之后安装了codecov。

我试着跑

pipenv lock --clear
pipenv lock --pre --clear
Run Code Online (Sandbox Code Playgroud)

但只有在卸载了名称错误的库后我才成功。