如何在install_requires中指定版本范围(setuptools,distribute)

时间:2012-07-13 14:45:10

标签: python setuptools

我想创建一个依赖于特定版本范围的包,例如>= 0.5.0, < 0.7.0。可以在install_requires选项中使用,如果可以,应该怎么做?

4 个答案:

答案 0 :(得分:37)

根据the documentation,您的语法应该可以正常工作。文档说明:

  

setuptoolspkg_resources使用通用语法来指定项目所需的依赖项。此语法由项目的PyPI名称组成,可选地后跟逗号分隔的方括号中的“extras”列表,可选地后跟逗号分隔的版本说明符列表。版本说明符是运算符&lt;,&gt;,&lt; =,&gt; =,==或!=之一,后跟版本标识符。

文档提供了一个简单的示例:

docutils >= 0.3

# comment lines and \ continuations are allowed in requirement strings
BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \
    ==1.6, ==1.7  # and so are line-end comments

要进行扩展,如果您希望您的软件包要求版本docutils大于0.3但小于0.5版,那么这样的代码将起作用:

docutils >= 0.3, <=0.5

另外两个注释。

  1. 该文档还指出冗余/重叠依赖关系规范将在内部合并,因此docutils >= 0.3, >=0.2将合并为docutils >= 0.3
  2. 另外,请注意指定冲突的版本号,"is meaningless and may therefore produce bizarre results."例如,我不知道你为什么会这样做,但是不要使用它:docutils >= 0.3, <=0.2因为这是不可能的。

答案 1 :(得分:15)

警惕非自愿的beta测试。软件包维护者有时会在不发出警告的情况下向一般受众发布不兼容,不完整或损坏的a,b和c版本。下次你在一个新鲜的virtualenv中运行 setup.py 时,你可能会拉下其中一个有毒的蛋,突然你的程序会崩溃。

为了减轻这种风险,不要使用 foo >=0.3, <0.4样式声明,它具有纯数字上限。 <0.4仍然允许版本0.4a0,0.4a1,0.4b0,0.4c3等。当您编写时,请使用<0.4a0之类的上限,如foo >=0.3, <0.4a0中所示install_requires

setuptools 发生意外情况时,请尝试使用 verlib 对版本比较进行建模。只要您的版本标准化且不矛盾,Verlib就非常适合。下面是一个示例,演示了规范化版本的潜在反直觉排序:

#!/usr/bin/env python

from verlib import NormalizedVersion as V

assert (V("0.7.9") < V("0.8a0") < V("0.8a1") < V("0.8b0") < V("0.8b1")
    < V("0.8b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1") < V("0.9")
    < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0") < V("1.0")
    < V("1.0.1"))

assert (V("0.7.9") < V("0.8.0a0") < V("0.8.0a1") < V("0.8.0b0")
    < V("0.8.0b1") < V("0.8.0b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1")
    < V("0.9") < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0")
    < V("1.0") < V("1.0.1"))

print "Version comparisons are sane."

答案 2 :(得分:0)

另一种方法是使用通配符。

这不适用于> = 0.5.0,<0.7.0,但是如果您决定应支持所有维护版本(例如0.5.0至0.5.x),则可以使用

== 0.5。*

例如 docutils == 0.3。*

答案 3 :(得分:0)

OP的问题>= 0.5.0, < 0.7.0中提到的符号已经有效。

并且,由于许多(如果不是大多数)库已经使用semantic versioning,因此根据定义,您可以将依赖项定义为A>=1,<2explained here。他们甚至实现了an even simpler syntax for it, A~=X.Y,这意味着它至少需要发布X.Y,而且还允许以后使用匹配的MAJOR版本进行发布。