使用pip升级包而不升级依赖项?

73 投票
3 回答
65938 浏览
提问于 2025-04-15 22:52

我在为我的Python应用程序使用pip和virtualenv。我想升级到应用程序的新版本,但又不想更改依赖包。当我使用pip install -U时,它会尝试升级所有的包,甚至在没有新版本的情况下还会卸载并重新安装同样版本的依赖包。

我也试过pip install -U --no-deps,但这似乎和普通安装没什么区别,而不是升级。有没有什么组合的选项可以实现我想要的效果?

3 个回答

4

你说得对。我之前以为加上 --no-deps 这个选项后,它就不会卸载已经存在的版本了。但是我又试了一次,发现其实没有问题:

$ pip install -U --no-deps myproj
Downloading/unpacking myproj
  Downloading myproj-1.0-trunk.31072.tar.gz (43Kb): 43Kb downloaded
  Running setup.py egg_info for package myproj
Installing collected packages: myproj
  Found existing installation: myproj 1.0-trunk.31053
    Uninstalling myproj:
      Successfully uninstalled myproj
  Running setup.py install for myproj
Successfully installed myproj
Cleaning up...
61

我刚在我的虚拟环境项目中试了一下,发现 pip install -U --no-deps mypackage 运行得很好。它只下载了 mypackage,没有其他东西。你那边的环境是什么样的呢?

79

概述:

  • 安装新包时不升级已安装的包:使用 pip install(不加 -U
  • 只升级那些根据需求已经过时的包:使用 pip install --upgrade --upgrade-strategy only-if-needed(这是新版本的默认设置)
  • 将包和所有依赖项升级到最新版本:使用 pip install --upgrade --upgrade-strategy eager(这是旧版本的默认设置)
  • 安装或升级列出的包时不更改依赖项:使用 --no-deps

更新(感谢 @Jether 的评论):如果你使用的是最新版本的 pip,那么现在的默认行为是只在必要时更新依赖项,你不需要做任何特别的操作!下面的内容是针对旧版本 pip 的步骤(如果你想要兼容新旧版本也可以使用)。

如果你真的想不去碰依赖项,那么确实可以这样做:

pip install -U --no-deps mypackage

但我认为你通常希望的是,除非有必要,否则不升级依赖项。在这种情况下,你可以使用:

pip install --upgrade --upgrade-strategy only-if-needed mypackage

这只会在包需要比已安装的版本更新的版本时,才更新需求。

撰写回答