使用pip升级软件包但不升级依赖关系,该如何操作?

71
我正在使用pip和virtualenv来管理我的Python应用程序。我想升级应用程序的新版本,但又不想影响依赖项。当我使用pip install -U命令时,它会尝试升级所有的软件包,甚至在没有新版本可用时也会卸载并重新安装依赖软件包的相同版本。
我还尝试过pip install -U --no-deps命令,但这似乎等同于常规安装,而不是升级。是否有一些参数组合可以达到我的目的呢?

好问题。我交叉链接了https://dev59.com/v3E85IYBdhLWcg3wOw_s如果您甚至无法提前列出依赖项,似乎您已经陷入困境。 - denis
3个回答

78

概述:

  • 安装新的软件包而不升级已安装的软件包: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

仅当软件包需要比当前安装的版本更高版本时,才会更新要求。


这是现在pip的新默认策略:https://github.com/pypa/pip/pull/4500 - Jether
11
我刚刚盲目地复制了答案中的命令,它确实安装了一些mypackage库到我的Python中。 - ImportanceOfBeingErnest
2
我相信eager是默认设置。only-if-needed将成为pip 10.0的默认设置:https://github.com/pypa/pip/pull/4500/files,https://pypi.python.org/pypi/pip。 - Jérôme
2
有没有“仅在不存在时”的选项?我不想让PIP触及任何现有的软件包,但是让它安装缺失的软件包... - Daniel Möller
1
如何安装最新的软件包,而不需要更新依赖项? - Muhammad Yasirroni
显示剩余2条评论

61
我刚刚在我的虚拟环境项目上尝试了一下,pip install -U --no-deps mypackage似乎完美运行。它只下载了mypackage而不是其他任何东西。你的设置是怎样的?

我的困惑来自于当你给pip一个特定的tarball和一个包名时行为上的差异。Carl Meyer提供了一个有用的解释:http://groups.google.com/group/python-virtualenv/msg/d702c251a6dc40a5 - Amy G
3
我强烈建议在运行完pip命令后,再运行一遍pip check命令,以检查是否存在缺少依赖包的问题。请注意不要改变原意,尽量使句子通俗易懂。 - Flimm

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...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接