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


233

我想知道是否有任何方法可以告诉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在需求文件中使用静态行。

有什么办法吗?

Answers:


301

你可以做:

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

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

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


无效链接。官方文档在这里
Beatgammit 2014年

45
作为记录,我认为"package>=0.2,<=0.3"这没有什么意义:什么时候可以使用0.2和0.3.0,但不能使用0.3的任何错误修复程序?我认为这"package>=0.2,<0.3"是一个更好的示例,因为它反映了以下常见情况:“请给我当前次要版本的最新错误修正版本,但不要自动将我升级到下一个次要版本,因为我想这样做明确指出,确保没有影响我的功能变更。”
Henrik Heimbuerger 2014年

如果您喜欢这个答案,那么您会喜欢下面的Mortiz答案!一定要检查一下,这~=0.2是一个更好的解决方案。
布拉德·根

1
@BradRoot ~=0.2.1例如,目前尚不清楚该怎么做。明确地表现>=0.2,<0.3是件好事,因为它确实很清楚发生了什么。
Acumenus

@Acumenus理解需求格式的属性以及版本控制工作原理的人不会写~=0.2.1在需求文件中。那是用户错误,不是~=前缀的缺点。
布拉德·根

86

您还可以使用:

pip install package==0.5.*

更加一致且易于阅读。


12
这是管理requirements.txtIMO的更好的方法。使用package==1.*而不是package>=1.2防止pip为软件包安装主要版本2+,这是理想的,因为主要版本更改通常是向后不兼容的。
Michael Hays

10
注意,这不会升级现有软件包。例如,如果您已安装0.5.1,但最新版本是0.5.2,然后运行install 0.5。*,它将显示“已经满意”,而您剩下0.5.1。添加--upgrade可以解决该问题。
scipilot

71

一种优雅的方法是使用~=符合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和计划的将来2.2.1,尽管没有大数,该数字是否会~=2.2.*匹配2.2
Mike'Pomax'Kamermans

1
@ Mike'Pomax'Kamermans ~=2.2.0在这种情况下,您应该使用(*如果使用,运算符将不起作用~=)。2.22.2.0(和2.2.0.0,等等)在安装软件包时在内部处理为同一件事。
ik1ne

尚不清楚这对于嵌套版本编号(例如)如何工作~=1.2.3。改为使用多条款形式更为明确和清晰。
Acumenus

2
@MitchMcMabers仅在主要版本的第一个版本中恰好存在您想要的功能时才有效,通常这是不正确的。例如,如果您依赖于v1.2.0中添加的内容,== 1.*将不正确地接受v1.1.0。该~=(或>=加上<如果你发现很难读)运算符是更好,因为它鼓励被正确特定。
Maxpm

1
@Maxpm这是一个好点。因此== 1.*,如果我们需要1.2版本的功能,但用户已经安装了1.1版,则将失败并且不执行任何操作。您的提议~= 1.2>= 1.2, < 2.0(或>= 1.2, == 1.*)相同。是的,~=是的,它是最好的运算符,因为它可以让您定位使用的库的开发版本,同时允许在同一主要版本中使用较新的版本。感谢您的澄清!
米切尔·麦克马伯斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.