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

Posted

技术标签:

【中文标题】升级包而不使用 pip 升级依赖项?【英文标题】:Upgrade package without upgrading dependencies using pip? 【发布时间】:2011-02-21 02:47:21 【问题描述】:

我在我的 python 应用程序中使用 pip 和 virtualenv。我想在不触及依赖项的情况下升级到新版本的应用程序。当我使用pip install -U 时,它会尝试升级所有包,甚至在没有可用新版本时卸载并重新安装相同版本的依赖包。

我也尝试过pip install -U --no-deps,但这似乎等同于常规安装而不是升级。是否有可以满足我要求的标志组合?

【问题讨论】:

好问题。我交叉链接了***.com/questions/2875232/…——如果你甚至不能提前列出依赖项,那么你似乎被卡住了。 【参考方案1】:

概述:

安装新包而不升级已安装的包: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 中新的默认策略:github.com/pypa/pip/pull/4500 大声笑,我只是盲目地从答案中复制了命令,它确实在我的 python 中安装了一些mypackage 我相信 Eager 是默认设置。 only-if-needed 将是 pip 10.0 中的默认值:github.com/pypa/pip/pull/4500/files、pypi.python.org/pypi/pip。 是否有“仅当不存在时”的选项?我不想让 PIP 触及任何现有的包,但让它安装缺少的包.... @DanielMöller 这难道不是pip install 没有--upgrade 所做的吗?【参考方案2】:

我刚刚尝试了我的 virtualenv 项目,pip install -U --no-deps mypackage 似乎工作得很好。它只是下载 mypackage 而不是别的。你的设置是什么样的?

【讨论】:

我的困惑来自于你给 pip 一个特定的 tarball 和一个包名时的行为差异。 Carl Meyer 有一个有用的解释:groups.google.com/group/python-virtualenv/msg/d702c251a6dc40a5 我强烈建议之后运行pip check 以检查是否存在缺少依赖项的任何问题。【参考方案3】:

你是对的。我以为当我添加--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...

【讨论】:

以上是关于升级包而不使用 pip 升级依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

pip安装pandas而不升级pip

为啥有些包可以在 Pip 中升级,而不是在 Conda 中? [复制]

如何使用 pip 升级所有 Python 包

在 virtualenv 中控制 pip 版本

依赖项升级后 Android Firebase 依赖项出现颤振问题

当安装包而不是单个学说依赖项时,如何更新 orm-pack 的单个包?