在我的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')
我想知道这里有两件事:
pip freeze
使用版本末尾的ubuntu2
?pip freeze
使用===
代替==
?[编辑]
还有一个问题:
===
和ubuntu2
(我分别试过)?答案 0 :(得分:1)
===
是arbitrary equality clause,在PEP-0440中定义:
任意相等比较是简单的字符串相等操作 其中没有考虑任何语义信息 零填充或本地版本。此运营商也不支持 前缀匹配为==运算符。
任意相等的主要用例是允许指定 本PEP无法表示的版本。这个 操作员是特殊的,并作为逃生舱,允许有人使用 实现此PEP以仍然安装旧版本的工具 否则与本PEP不相容。
一个例子是=== foobar,它将匹配一个foobar版本。
此运算符也可用于明确要求未修补 一个项目的版本,例如=== 1.0,它与a不匹配 版本1.0 +下游1.
强烈建议不要使用此操作符,并且工具可能会显示 使用时发出警告。
您应该在目标计算机上升级您的pip版本(pip install --upgrade pip
),它不应显示错误消息。