我想知道是否有任何方法可以告诉 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
行。
有没有办法做到这一点?
你可以做:
$ pip install "package>=0.2,<0.3"
pip
将寻找最佳匹配,假设版本至少为 0.2 且小于 0.3。
这也适用于 pip requirements files。请参阅 PEP 440 中有关版本说明符的完整详细信息。
您还可以使用:
pip install package==0.5.*
这更一致且易于阅读。
requirements.txt
IMO 的更好方法。使用 package==1.*
而不是 package>=1.2
可防止 pip 为软件包安装主要版本 2+,这是可取的,因为主要版本更改通常是向后不兼容的。
pip install matplotlib==3.2.*
zsh: no matches found: matplotlib==3.2.*
rm myfiles*
时一样。您需要转义参数,例如使用单引号 pip install 'matplotlib==3.2.*'
。
一个优雅的方法是根据 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.*
~=2.2.0
(如果您使用 ~=
,则 *
运算符将不起作用)。在安装软件包时,2.2
和 2.2.0
(以及 2.2.0.0
等)在内部处理相同的事情。
~=1.2.3
。使用多子句形式会更加明确和清晰。
== 1.*
将不正确地接受 v1.1.0。 ~=
(或 >=
加上 <
,如果您觉得难以阅读)运算符更好,因为它鼓励正确具体。
== 1.*
将失败并且什么也不做。您提议的 ~= 1.2
与说 >= 1.2, < 2.0
(或 >= 1.2, == 1.*
)相同。所以是的,你是对的,~=
是最好的运算符,因为它可以让你定位你使用的库的开发版本,同时允许 same 主要版本中的新版本。感谢您的澄清!
numpy~=1.17.0
下载 1.17.5,但 numpy~=1.17
下载 1.18.5,这对我来说似乎很奇怪。
nok.github.io/pipdev 是一种交互式工具,供开发人员测试已定义的说明符以进行版本处理。
https://i.stack.imgur.com/mbkzt.png
与问题相关:nok.github.io/pipdev?spec=~=0.5.0&vers=0.6
不定期副业成功案例分享
"package>=0.2,<=0.3"
没有多大意义:你什么时候可以同时使用 0.2 和 0.3.0,但不能使用 0.3 的任何错误修复版本?我认为"package>=0.2,<0.3"
是一个更好的例子,因为它反映了这样一种常见情况:“请给我当前次要版本的最新错误修复版本,但不要自动将我升级到下一个次要版本,因为我会喜欢明确地这样做,确保没有影响我的功能变化。”~=0.2
是(恕我直言)比这更好的解决方案。~=0.2.1
会做什么。像>=0.2,<0.3
那样明确是一件好事,因为它真的很清楚正在发生什么。~=0.2.1
。这是用户错误,而不是~=
前缀的缺点。~=0.2.1
不是指>=0.2.1,<0.3
吗?怎么会是用户错误?