【问题标题】:How to pip install a package with min and max version range?如何 pip 安装具有最小和最大版本范围的软件包?
【发布时间】:2012-02-06 09:54:15
【问题描述】:

我想知道是否有任何方法可以告诉 pip,特别是在需求文件中,安装具有最低版本 (pip install package>=0.2) 和永远不应该安装的最高版本的软件包(理论 api:@987654322 @)。

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

有什么办法吗?

【问题讨论】:

    标签: python pip multiple-versions


    【解决方案1】:

    你可以这样做:

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

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

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

    【讨论】:

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

    你也可以使用:

    pip install package==0.5.*
    

    更一致且易于阅读。

    【讨论】:

    • 这是管理requirements.txt IMO 的更好方法。使用 package==1.* 而不是 package&gt;=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.*'
    【解决方案3】:

    一个优雅的方法是根据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 等)在内部处理方式相同。
    • @MitchMcMabers 仅当您想要的功能恰好出现在该主要版本的第一个版本中时才有效,这通常不是真的。例如,如果您依赖于 v1.2.0 中添加的内容,== 1.* 将不正确地接受 v1.1.0。 ~=(或 &gt;= 加上 &lt;,如果您觉得难以阅读)运算符更好,因为它鼓励正确具体。
    • @Maxpm 这是一个很好的观点。因此,如果我们需要 1.2 版本的功能但用户已经安装了 1.1,== 1.* 将失败并且什么也不做。您提议的~= 1.2 与说&gt;= 1.2, &lt; 2.0(或&gt;= 1.2, == 1.*)相同。所以是的,你是对的,~= 是最好的运算符,因为它可以让你定位你使用的库的开发版本,同时允许 same 主要版本中的新版本。感谢您的澄清!
    • numpy~=1.17.0 下载 1.17.5,但 numpy~=1.17 下载 1.18.5 对我来说似乎很奇怪。
    • @naught101 好吧,semver standards,1.18.0 应该与 1.17.5 功能兼容。没有一个开发者是完美的,所以它肯定不会是完美的,但出于同样的原因,1.17.6 也有可能无法兼容。如果我们假设正确遵循了 semver,那么 1.18 将向后兼容。不管它实际上是否有效,我的观点是,在 ~= 运算符的上下文中,十进制级别是指定软件包版本要求的灵活/准确程度的一种方式。
    猜你喜欢
    • 2018-06-11
    • 2018-12-29
    • 2022-01-08
    • 2018-09-26
    • 1970-01-01
    • 2015-11-22
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多