ChatGPT解决这个技术问题 Extra ChatGPT

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

我想知道是否有任何方法可以告诉 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 行。

有没有办法做到这一点?


L
Leif Arne Storset

你可以做:

$ pip install "package>=0.2,<0.3"

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

这也适用于 pip requirements files。请参阅 PEP 440 中有关版本说明符的完整详细信息。


作为记录,我认为 "package>=0.2,<=0.3" 没有多大意义:你什么时候可以同时使用 0.2 和 0.3.0,但不能使用 0.3 的任何错误修复版本?我认为 "package>=0.2,<0.3" 是一个更好的例子,因为它反映了这样一种常见情况:“请给我当前次要版本的最新错误修复版本,但不要自动将我升级到下一个次要版本,因为我会喜欢明确地这样做,确保没有影响我的功能变化。”
如果你喜欢这个答案,你会喜欢下面的 Mortiz 答案!请务必检查一下,~=0.2 是(恕我直言)比这更好的解决方案。
@BradRoot 例如,真的不清楚 ~=0.2.1 会做什么。像 >=0.2,<0.3 那样明确是一件好事,因为它真的很清楚正在发生什么。
@Acumenus 了解需求格式的属性以及版本控制如何工作的人不会在需求文件中写入 ~=0.2.1。这是用户错误,而不是 ~= 前缀的缺点。
@BradRoot ~=0.2.1 不是指 >=0.2.1,<0.3 吗?怎么会是用户错误?
l
lowrin

您还可以使用:

pip install package==0.5.*

这更一致且易于阅读。


这是管理 requirements.txt IMO 的更好方法。使用 package==1.* 而不是 package>=1.2 可防止 pip 为软件包安装主要版本 2+,这是可取的,因为主要版本更改通常是向后不兼容的。
请注意,这不会升级现有软件包。例如,如果您安装了 0.5.1,但 0.5.2 是最新的,并且您运行 install 0.5.*,它会说“已经满意”并留下 0.5.1。添加 --upgrade 解决了它。
这对我不起作用pip install matplotlib==3.2.* zsh: no matches found: matplotlib==3.2.*
@Tillus zsh 正在扩展星号(就像您执行 rm myfiles* 时一样。您需要转义参数,例如使用单引号 pip install 'matplotlib==3.2.*'
M
Moritz

一个优雅的方法是根据 PEP 440 使用 ~= 兼容的发布运算符。在您的情况下,这相当于:

package~=0.5.0

例如,如果存在以下版本,它将选择 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.*

@Mike'Pomax'Kamermans 在这种情况下您应该使用 ~=2.2.0 (如果您使用 ~=,则 * 运算符将不起作用)。在安装软件包时,2.22.2.0(以及 2.2.0.0 等)在内部处理相同的事情。
非常不清楚这如何用于嵌套版本编号,例如 ~=1.2.3。使用多子句形式会更加明确和清晰。
@MitchMcMabers 仅当您想要的功能恰好出现在该主要版本的第一个版本中时才有效,这通常不是真的。例如,如果您依赖 v1.2.0 中添加的内容,== 1.* 将不正确地接受 v1.1.0。 ~=(或 >= 加上 <,如果您觉得难以阅读)运算符更好,因为它鼓励正确具体。
@Maxpm 这是一个好点。因此,如果我们需要 1.2 版本的功能但用户已经安装了 1.1,== 1.* 将失败并且什么也不做。您提议的 ~= 1.2 与说 >= 1.2, < 2.0(或 >= 1.2, == 1.*)相同。所以是的,你是对的,~= 是最好的运算符,因为它可以让你定位你使用的库的开发版本,同时允许 same 主要版本中的新版本。感谢您的澄清!
numpy~=1.17.0 下载 1.17.5,但 numpy~=1.17 下载 1.18.5,这对我来说似乎很奇怪。
D
Darius

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

https://i.stack.imgur.com/mbkzt.png

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