如何安装distro-info===0.18ubuntu0.18.04.1?Django项目依赖安装报错
Django旧项目现代化中requirements.txt的distro-info安装错误解决
我在对Django 2.2旧项目做现代化改造时,用pip freeze生成的requirements.txt里有一行导致pip install执行失败:
distro-info===0.18ubuntu0.18.04.1
我推测报错原因是版本字符串不符合PEP规范,但PEP-518里并没有提到===运算符。Stack上有类似问题,但和我的情况有两点不同:
- 他们遇到的是
ValueError,我遇到的是ParseError; - 他们的解决方案是升级pip,但我已经使用了最新版本的pip。
目前直接执行pip install distro-info可以正常完成,我是否应该直接采用这种方式?
更新:该项目约创建于2020年,查distro-info的PyPI历史记录,它2013年发布0.10版本,2021年发布1.0版本。这会不会和pip freeze生成的怪异输出有关?
报错信息如下:
ERROR: Exception: Traceback (most recent call last): File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3021, in _dep_map return self.__dep_map File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2815, in __getattr__ raise AttributeError(attr) AttributeError: _DistInfoDistribution__dep_map During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py", line 102, in __init__ req = REQUIREMENT.parseString(requirement_string) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pyparsing/core.py", line 1141, in parse_string raise exc.with_traceback(None) pip._vendor.pyparsing.exceptions.ParseException: Expected string_end, found '(' (at char 12), (line:1, col:13) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3101, in __init__ super(Requirement, self).__init__(requirement_string) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py", line 104, in __init__ raise InvalidRequirement( pip._vendor.packaging.requirements.InvalidRequirement: Parse error at "'(===0.18'": Expected string_end During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 160, in exc_logging_wrapper status = run_func(*args) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 247, in wrapper return func(self, options, args) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/commands/install.py", line 400, in run requirement_set = resolver.resolve( File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py", line 92, in resolve result = self._result = resolver.resolve( File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 481, in resolve state = resolution.resolve(requirements, max_rounds=max_rounds) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 373, in resolve failure_causes = self._attempt_to_pin_criterion(name) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 213, in _attempt_to_pin_criterion criteria = self._get_updated_criteria(candidate) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers.py", line 203, in _get_updated_criteria for requirement in self._p.get_dependencies(candidate=candidate): File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py", line 237, in get_dependencies return [r for r in candidate.iter_dependencies(with_requires) if r is not None] File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py", line 237, in <listcomp> return [r for r in candidate.iter_dependencies(with_requires) if r is not None] File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py", line 247, in iter_dependencies requires = self.dist.iter_dependencies() if with_requires else () File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py", line 216, in iter_dependencies return self._dist.requires(extras) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2736, in requires dm = self._dep_map File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3023, in _dep_map self.__dep_map = self._compute_dependencies() File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3033, in _compute_dependencies reqs.extend(parse_requirements(req)) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3094, in parse_requirements yield Requirement(line) File "/home/old-django-project/.venv/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3103, in __init__ raise RequirementParseError(str(e)) pip._vendor.pkg_resources.RequirementParseError: Parse error at "'(===0.18'": Expected string_end
问题根源分析
===的由来:这个怪异的版本格式是旧版pip的产物。2020年项目创建时的pip版本,在处理Ubuntu仓库打包的Python包(版本号带系统后缀)时,错误输出了===运算符,而PEP-508规范里只定义了==、>=等合法运算符,新版pip无法解析这种格式。- 版本时间线关联:当时Ubuntu 18.04仓库里的distro-info版本是
0.18ubuntu0.18.04.1,旧版pip freeze捕获这类系统包版本时出现兼容性问题,才生成了错误格式。
解决方案
直接用pip install distro-info是可行的,但可以根据项目需求选择更稳妥的方式:
- 不需要严格固定旧版本:把
requirements.txt里的错误行改成distro-info,让pip自动安装兼容的最新版本。distro-info 1.0+兼容Python 3.6+,和Django 2.2的Python版本要求匹配,不会有兼容性问题。 - 需要匹配旧环境版本:把
===改成==,即distro-info==0.18ubuntu0.18.04.1,但注意这个版本是Ubuntu仓库特有的,PyPI上没有。如果新环境不是Ubuntu 18.04,建议换成PyPI上的官方版本distro-info==0.18,测试后确认兼容再替换。
验证步骤
- 在测试环境执行
pip install distro-info==0.18,运行项目核心功能确认无依赖问题; - 若功能正常,就替换
requirements.txt里的错误行;若新版本兼容也没问题,直接写distro-info即可。
内容的提问来源于stack exchange,提问作者toraritte
相关产品推荐
相关产品推荐

