目前,Django项目支持1.4,1.7和1.8。在我的setup.py
中,我想将这些版本反映为受支持。
install_requires=['Django>=1.4.2,<1.8.99,!=1.5,!=1.6']
然而,这仍然允许1.5.x和1.6.x版本。如何排除完整范围?
Setuptools lists以下有效要求为例:
PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
然而,这不适用于pip(它至少应该匹配1.4.x / 1.5.x):
找不到PickyThing的匹配分布!= 1.9.6,&lt; 1.6,&lt; 2.0a0,== 2.4c1,&gt; 1.9
使用示例更新
例如;我只想包括currently supported versions of Django。这将是1.4.x,1.7.x和1.8.x.所以我会写;
#setup.py
install_requires=['Django>=1.4.2,<1.4.99,>=1.7,<1.8.99']
但是,如果我在此项目上运行pip install -e .
,则会失败;
Collecting Django<1.4.99,<1.8.99,>=1.4.2,>=1.7 (from ...)
Could not find a version that satisfies the requirement Django<1.4.99,<1.8.99,>=1.4.2,>=1.7 (from django-two-factor-auth==1.2.0) (from versions: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.4.8, 1.4.9, 1.4.10, 1.4.11, 1.4.12, 1.4.13, 1.4.14, 1.4.15, 1.4.16, 1.4.17, 1.4.18, 1.4.19, 1.4.20, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11, 1.5.12, 1.6, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.6.11, 1.7, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.8a1, 1.8b1, 1.8b2, 1.8rc1, 1.8, 1.8.1)
No matching distribution found for Django<1.4.99,<1.8.99,>=1.4.2,>=1.7 (from ...)
很明显,版本号1.4.20不能满足>=1.7
,1.8.1不能满足<1.4.99
。然而,来自Setuptools的文档(见上文)确实表明应该可以采用这些方法。但是,这对我来说并不明显。
答案 0 :(得分:3)
您可以使用Django>=1.4.2,<1.9,!=1.5.*,!=1.6.*
这是在PEP440内定义的。
您可以使用最新版本的setuptools和pip中出售的packaging模块测试此行为。
In [1]: from packaging import specifiers
In [2]: sp=specifiers.SpecifierSet(">=1.4.2,<1.9,!=1.5.*,!=1.6.*")
In [3]: sp.contains("1.4.2")
Out[3]: True
In [4]: sp.contains("1.6.4")
Out[4]: False
In [5]: sp.contains("1.8.2")
Out[5]: True