如何安装具有最小和最大版本范围的软件包?

cor*_*ror 199 python pip multiple-versions

我想知道是否有任何方法可以告诉pip,特别是在一个需求文件中,安装一个包含最小版本(pip install package>=0.2)和最小版本的软件包(应该永远不会安装)(理论上的api :) pip install package<0.3.

我问,因为我正在使用正在积极开发的第三方库.我希望我的pip需求文件指定它应该始终安装0.5.x分支的最新次要版本,但我不希望pip尝试安装任何较新的主要版本(如0.6.x) API不同.这很重要,因为即使0.6.x分支可用,开发人员仍然会向0.5.x分支发布补丁和错误修正,因此我不想package==0.5.9在我的需求文件中使用静态行.

有没有办法做到这一点?

Hug*_*res 252

你可以做:

$ pip install "package>=0.2,<0.3"
Run Code Online (Sandbox Code Playgroud)

并且pip将寻找最佳匹配,假设该版本至少为0.2,小于0.3.

这也适用于pip 需求文件.请参阅PEP 440中有关版本说明符的完整详细信息.

  • 为了记录,我认为`"package> = 0.2,<= 0.3"`没有多大意义:你什么时候可以使用0.2和0.3.0,但不能使用任何0.3的错误修正版本?我认为`"package> = 0.2,<0.3"`是一个更好的例子,因为它反映了常见的说法:"请给我最新版本的当前次要版本,但不要自动升级到我下一个次要版本,因为我想明确地做到这一点,确保没有影响我的功能变化." (37认同)
  • 版本周围的引号对于避免 shell 解释 `&lt;` 或 `&gt;` 非常重要。 (4认同)
  • @BradRoot 例如,确实不清楚 `~=0.2.1` 会做什么。像 `&gt;=0.2,&lt;0.3` 那样明确是一件好事,因为它非常清楚发生了什么。 (3认同)
  • 如果您喜欢这个答案,您一定会喜欢下面莫蒂兹的答案!请务必检查一下,`~=0.2` 是(恕我直言)比这更好的解决方案。 (2认同)

low*_*rin 65

你也可以用:

pip install package==0.5.*
Run Code Online (Sandbox Code Playgroud)

这更加一致且易于阅读.

  • 这是管理`requirements.txt` IMO的更好方法.使用`package == 1.*`而不是`package> = 1.2`可以防止pip为软件包安装主要版本2+,这是可取的,因为主要版本更改往往是向后兼容的. (9认同)
  • 注意,这不会升级现有软件包。例如,如果您已安装0.5.1,但最新版本是0.5.2,然后运行install 0.5。*,它将显示“已经满意”,而您剩下0.5.1。添加--upgrade可以解决该问题。 (7认同)
  • @Tillus 星号正在由 zsh 展开(就像执行 `rm myfiles*` 时一样。您需要转义参数,例如使用单引号 `pip install 'matplotlib==3.2.*'`。 (6认同)

Mor*_*itz 51

一种优雅的方法是~=根据PEP 440使用兼容的释放操作符.在你的情况下,这将相当于:

package~=0.5.0
Run Code Online (Sandbox Code Playgroud)

例如,如果存在以下版本,则会选择0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

为澄清,每对都是等价的:

~= 0.5.0
>= 0.5.0, == 0.5.*

~= 0.5
>= 0.5, == 0.*
Run Code Online (Sandbox Code Playgroud)

  • 我觉得很奇怪,“numpy~=1.17.0”下载 1.17.5,但“numpy~=1.17”下载 1.18.5。 (4认同)
  • @MitchMcMabers 只有当您想要的功能恰好存在于该主要版本的第一个版本中时,这才有效,但通常情况下并非如此。例如,如果您依赖 v1.2.0 中添加的内容,“== 1.*”将不正确地接受 v1.1.0。“~=”(或者“&gt;=”加上“&lt;”,如果你觉得难以阅读)运算符更好,因为它鼓励正确地具体化。 (3认同)
  • 按规定工作。要获取 3.2.X 版本,请使用 matplotlib~=3.2.0 (3认同)
  • @Mike'Pomax'Kamermans 在这种情况下您应该使用 `~=2.2.0` (如果您使用 `~=`,`*` 运算符将不起作用)。在安装软件包时,“2.2”和“2.2.0”(以及“2.2.0.0”等)在内部以相同的方式处理。 (2认同)
  • 目前还不清楚这如何适用于嵌套版本编号,例如“~=1.2.3”。使用多从句形式更明确、更清晰。 (2认同)
  • @Maxpm 这是一个很好的观点。因此,如果我们需要 1.2 版本的功能但用户已经安装了 1.1,则 `== 1.*` 将失败并且不执行任何操作。您建议的“~= 1.2”与“&gt;= 1.2, &lt; 2.0”(或“&gt;= 1.2, == 1.*”)相同。所以是的,你是对的,“~=”是最好的运算符,因为它可以让你定位你使用的库的开发版本,同时允许在相同的主要版本中使用更新的版本。感谢您的澄清! (2认同)
  • @naught101我试图使用的心理模型是“有效数字”(就像在高中科学课上一样)。显示的信息量暗示了我们正在处理的特殊性。如果是 `~=1.17`,我们只关心次要 semver 级别的特异性。但如果它是“1.17.0”,我们希望特异性下降到补丁语义版本级别。它们都是相同的“数字”,但是小数点后的位数指定了我们使用的准确度级别。这很令人困惑,但我认为这是一个对我有帮助的助记符。希望它也能帮助你记住。 (2认同)

Dar*_* M. 16

nok.github.io/pipdev是一个交互式工具,供开发人员测试已定义的版本处理说明符。

在此输入图像描述

与问题相关:nok.github.io/pipdev?spec =~=0.5.0&vers=0.6