三个等号和ubuntu2在Python的pip freeze中是什么?

8
在我的AWS Ubuntu 14.04实例上,我刚刚执行了一个“pip freeze > requirements.txt”命令,这个命令生成了一个文件,其中包括以下两行内容:
python-apt===0.9.3.5ubuntu2
python-debian===0.1.21-nmu2ubuntu2

当我使用这个文件在另一个AWS Ubuntu 14.04实例上执行pip install -r requirements.txt时,我会得到以下回溯:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 262, in run
    for req in parse_requirements(filename, finder=finder, options=options, session=session):
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1632, in parse_requirements
    req = InstallRequirement.from_line(line, comes_from, prereleases=getattr(options, "pre", None))
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 173, in from_line
    return cls(req, comes_from, url=url, prereleases=prereleases)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 71, in __init__
    req = pkg_resources.Requirement.parse(req)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2667, in parse
    reqs = list(parse_requirements(s))
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2605, in parse_requirements
    line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec")
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2573, in scan_list
    raise ValueError("Expected "+item_name+" in",line,"at",line[p:])
ValueError: ('Expected version spec in', 'python-apt===0.9.3.5ubuntu2', 'at', '0.9.3.5ubuntu2')

我这里有两个问题:

  1. pip freeze 为什么要在版本号后面加上 ubuntu2
  2. pip freeze 为什么要用 === 而不是 ==

[编辑]

还有一个问题:

  1. 为什么另一台机器上的 pip 不接受 ===ubuntu2 (我尝试了分别使用它们)?

https://www.python.org/dev/peps/pep-0440/#arbitrary-equality - cel
1
我认为这是正确的重复问题,有点棘手找到:https://dev59.com/7Ivda4cB1Zd3GeqPUAcR - cel
1个回答

8
===任意相等运算符,并在PEP-0440中定义:
任意相等比较是简单的字符串相等操作,不考虑任何语义信息,如零填充或本地版本。该运算符也不支持前缀匹配,如==运算符所做的那样。
任意相等的主要用例是允许指定一个否则无法通过此PEP表示的版本。该运算符是特殊的,并作为逃生舱口,允许使用实现此PEP的工具的人仍然安装与此PEP不兼容的旧版。
一个例子是===foobar,它将匹配一个版本的foobar。
这个运算符也可以用于明确要求未打补丁的项目版本,例如===1.0,它将不匹配版本1.0+downstream1。
强烈不建议使用这个运算符,当使用时,工具可能会显示警告。
您需要在目标机器上升级pip版本(pip install --upgrade pip),并且不应显示错误消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接