pip3命令升级所有包,那要小心依赖冲突吗?

sdb*_*bbs 6 python pip

到目前为止,我已经使用了(通过如何使用 pip 升级所有 Python 包

pip3 list --format freeze --outdated | cut -d= -f1 | xargs pip3 install --upgrade-strategy eager --upgrade
Run Code Online (Sandbox Code Playgroud)

升级我所有的 Python pip 包。到目前为止,它对我来说效果很好 - 除了一次,当我收到某种冲突消息时,不幸的是我没有保留它的副本;我的猜测是,这与此处提到的类似: https://pip.pypa.io/en/stable/user_guide/#fixing-conflicting-dependencies

Due to conflicting dependencies pip cannot install
package_coffee and package_tea:
- package_coffee depends on package_water<3.0.0,>=2.4.2
- package_tea depends on package_water==2.3.1
Run Code Online (Sandbox Code Playgroud)

无论如何,现在我只是尝试安装voila我的 Jupyter 安装,结果如下:

(notebook) user@server:/home/web/Jupyter$ pip3 install voila
...
Installing collected packages: jupyter-client, voila
  Attempting uninstall: jupyter-client
    Found existing installation: jupyter-client 7.0.3
    Uninstalling jupyter-client-7.0.3:
      Successfully uninstalled jupyter-client-7.0.3
Successfully installed jupyter-client-6.1.12 voila-0.2.13
Run Code Online (Sandbox Code Playgroud)

换句话说:我jupyter-client-7.0.3之前已经安装过最新版本;但现在我想安装voila,由于要求,最新版本被卸载,并安装了与 兼容的voila早期版本。6.1.12voila

所以现在如果我想检查过时的软件包,我会如预期的那样jupyter-client列出:

(notebook) user@server:/home/web/Jupyter$ pip3 list --format freeze --outdated
jupyter-client==6.1.12
Run Code Online (Sandbox Code Playgroud)

...但是,如果我运行完整的管道命令,pip3 list --format freeze --outdated | cut -d= -f1 | xargs pip3 install --upgrade-strategy eager --upgrade那么它会想要升级jupyter-client到7.0.3,然后就会崩溃voila(我猜,我不敢尝试)。

那么,是否有一个升级命令,可以处理这样的情况,并在升级过程中出现这种状态时,阻止更改并给我一个通知?比如说:

警告:jupyter-client=6.1.12(最新版本 7.0.3)已升级 - 但是,安装该软件包会导致与当前安装的voila=0.2.13软件包发生冲突;不继续进行此升级。无论如何,要强制进行此升级,请使用 [...]

The*_*jot 7

由于重叠(子)依赖关系,在 python 中升级包从来都不是一件容易的事。有一些工具可以尝试帮助您进行管理。在我目前的工作中,我们使用pip-tools。在一些项目中我们使用诗歌,但我对其处理不太满意。

对于 pip-tools,您在文件中定义顶级包requirements.in,然后解析子(子子)依赖项并将它们输出到文件中requirements.txt。这样做的好处是您只需担心主包。如果需要,您仍然可以升级子依赖项。

长话短说; 盲目更新所有软件包很可能永远不会达到预期或预期的效果。软件包已升级,但停止工作,或者它们确实可以工作,但不能与已更新的另一个软件包一起使用,因为它们需要该软件包的较低版本。

我的建议是从您的主包开始,然后使用提到的工具之一从那里开始构建。对此没有灵丹妙药。依赖地狱在Python中是一个非常真实的事情。

  • 这一切都解决了包的“setup.py”,决定了它们的子依赖关系。一旦这些开始与不同的需求级别重叠,事情就真的开始变得令人讨厌。并不意味着它们不起作用,但 pip 会对此非常不满。我们有两个软件包,它们的版本要求不同,我认为是“六个”,幸运的是,更高版本是向后兼容的:D 我们设法摆脱了其中一个,呵呵。祝你好运!希望这可以帮助。我知道你的痛苦! (3认同)