Python 排除setuptools/pip中的某些依赖项版本范围

Python 排除setuptools/pip中的某些依赖项版本范围,python,pip,setuptools,Python,Pip,Setuptools,目前,Django项目支持1.4、1.7和1.8。在mysetup.py中,我希望将这些版本反映为受支持的版本 install_requires=['Django>=1.4.2,<1.8.99,!=1.5,!=1.6'] 很明显,版本号1.4.20不能满足=1.7和1.8.1不能满足我已经阅读了pkg\u资源的一些相关代码。我认为文件不准确。不仅pip找不到正确的软件包版本,python setup.py install,它实际上使用了setuptools,而且也失败了 一些相关代

目前,Django项目支持1.4、1.7和1.8。在my
setup.py
中,我希望将这些版本反映为受支持的版本

install_requires=['Django>=1.4.2,<1.8.99,!=1.5,!=1.6']

很明显,版本号1.4.20不能满足
=1.7
和1.8.1不能满足
我已经阅读了
pkg\u资源的一些相关代码。我认为文件不准确。不仅
pip
找不到正确的软件包版本,
python setup.py install
,它实际上使用了
setuptools
,而且也失败了

一些相关代码:

pip/_供应商/包装/说明符.py

您可以在评论中看到,作者强调,这将导致每个说明符之间出现
,而不是
。因此,如果您这样做:

PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1

PickyThing1.9=1.9.6,你可以使用
Django>=1.4.2,这个错误发生在做什么的时候?@skyline75489查看我的更新。你使用的是哪一个pip版本?我的pip版本是6.1.1。我还将setuptools从3.6升级到了15.2,但没有任何效果。感谢你的调查,一旦有机会,我将奖励你。我已经提交给皮普了。这是实际的答案@Bouke,你应该考虑更新你的选择!
#setup.py
install_requires=['Django>=1.4.2,<1.4.99,>=1.7,<1.8.99']
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 ...)
# If we have any specifiers, then we want to wrap our iterable in the
# filter method for each one, this will act as a logical AND amongst
# each specifier.
if self._specs:
    for spec in self._specs:
        iterable = spec.filter(iterable, prereleases=prereleases)
    return iterable
PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
import pkg_resources

a = ['1.4', '1.8', '1.9.2']
d = pkg_resources.Requirement.parse('PickyThing<1.6,>1.9,!=1.9.6')
r = d.specifier.filter(a)

print(list(r)) # Nothing, just an empty list []
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