【问题标题】:Python virtual environments created since mid-August raise `AssertionError` for `python3 -m pip freeze`自 8 月中旬以来创建的 Python 虚拟环境为 `python3 -m pip freeze` 引发了 `AssertionError`
【发布时间】:2020-10-13 16:54:31
【问题描述】:

在 MacOS 10.15.7 (Python 3.8.6) 和 Ubuntu 20.04 (Python 3.8.5) 上,我为我正在编写的各种 Python 脚本安装了各种虚拟环境(全部在 Git 和 Github 上)。项目使用pyproject.tomlflit 一起使用。我使用脚本中使用的模块创建并填充了环境,如下所示(其中 $VENVS 是我保留虚拟环境的目录):

$ python3 -m venv $VENVS/csvenv
$ source $VENVS/csvenv/bin/activate
(csvenv) $ python3 -m pip install --upgrade flit
(csvenv) $ flit install -s      # to install script as "editable"

但是,在两个平台上,python3 -m pip freeze 命令在虚拟环境中执行时会得到不同的结果:

  • 在 8 月 17 日之前创建的环境中,它会显示已安装的模块(应该如此)。
  • 在较新的环境中,我得到:
ERROR: Exception:
Traceback (most recent call last):
  File "/Users/tbaker/venvs/dcapenv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 228, in _main
    status = self.run(options, args)
  File "/Users/tbaker/venvs/dcapenv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py", line 101, in run
    for line in freeze(**freeze_kwargs):
  File "/Users/tbaker/venvs/dcapenv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py", line 67, in freeze
    req = FrozenRequirement.from_dist(dist)
  File "/Users/tbaker/venvs/dcapenv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py", line 257, in from_dist
    req = direct_url_as_pep440_direct_reference(
  File "/Users/tbaker/venvs/dcapenv/lib/python3.8/site-packages/pip/_internal/utils/direct_url_helpers.py", line 49, in direct_url_as_pep440_direct_reference
    assert not direct_url.info.editable
AssertionError

我的猜测是,这取决于创建环境的时间,这既基于目录时间戳,也基于 Readthedocs 上的构建检查,Readthedocs 会在推送存储库时重新构建文档。

在 8 月 17 日之前创建环境的项目的文档一直在不间断地重建,而具有较新环境的项目的文档自 8 月以来一直未能构建。在 8 月 17 日的提交中,添加了一个 requirements.txt 文件。

如果我恢复 requirements.txt,RTD 构建会失败并显示以下消息:

ERROR: Could not find a version that satisfies the requirement csv2shex==0.2 (from -r docs/requirements.txt (line 16)) (from versions: none)
ERROR: No matching distribution found for csv2shex==0.2 (from -r docs/requirements.txt (line 16))

如果我使用deactivate 退出虚拟环境,执行python3 -m pip freeze >requirements.txt(在虚拟环境之外工作)并推送,Readthedocs 无法构建并出现相同的错误。

pip freeze >requirements.txt 在我使用 7 月创建的虚拟环境时确实有效。但是,当我在 Ubuntu 上克隆该项目并重新创建虚拟环境(如上)时,pip freeze 会引发异常。如果我在 MacOS 上创建并填充新的虚拟环境,它也会失败。但是,如果我从 7 月开始在虚拟环境中创建一个新的 requirements.txt 文件并推送,则文档会生成。

在 pip 的direct_url_helpers.py 的第 49 行引发了异常,其中包括以下注释:

    # pip should never reach this point for editables, since
    # pip freeze inspects the editable project location to produce
    # the requirement string
    assert not direct_url.info.editable

我已经研究了好几个小时。对pip freezeAssertionErroreditable project location 等的搜索一无所获。 Stackoverflow search "pip freeze assertionerror" 仅产生 12 个结果,除了 2015 年或更早的一个结果,以及一个 2019 年关于涉及 Docker 的问题的结果。

总而言之,在我看来:

  • 在我的 MacOS 和 Ubuntu 系统上,pip freeze 在 8 月 17 日之后创建的虚拟环境中不起作用(使用 python3 -m venv
  • 如果存在使用早于 8 月 17 日的虚拟环境构建的 requirements.txt 文件,Readthedocs 文档构建成功。
  • 如果存在在任何虚拟环境之外构建的 requirements.txt 文件,Readthedocs 文档构建会失败 - 始终显示上面的消息,它指的是

但是,有些事情并没有加起来:

  • 我相当肯定我会在虚拟环境中创建 8 月 17 日的 requirements.txt 文件,因为我从不使用虚拟环境之外的项目。但除非pip freeze 正常工作,否则怎么可能?

有人可以解释一下吗?这是python3 -m venvflit 还是其他问题?我是否至少正确地怀疑 RTD 构建的失败与 pip freeze 的失败有某种关系?

【问题讨论】:

  • 每个 venv 有哪些版本的 Python、pip、flit 和任何其他工具?具体来说,有效和无效之间有区别吗?当然,由于pip freeze 不起作用,您需要从各个工具中获取版本。比如激活一个env后,使用pip --versionpython --versionflit --version
  • 不确定为什么会发生这种情况,但有 a change to pip freeze merged on April 1 2020 包括您在此处描述的 AssertionError。 github上的那个线程可能有用。显然,拉取请求是PEP 610 的实现。
  • @jakub 提到的更改在 pip 版本 20.1 中是 included。我的猜测是,你的旧 venv 安装了旧版本的 pip,而后来创建的 venv 都使用 20.1 或更高版本,
  • @Waylan 谢谢你的建议。 pip freeze 在 7 月创建的虚拟环境具有 Flit 2.3.0 和 Pip 20.2.3 以及 Python 3.8。较新的 venv,其中 pip freeze 不起作用,具有 Flit 3.0.0 和 Pip 20.2.3 以及 Python 3.8。
  • 我在 Pip repo 上创建了一个问题,准确描述了 how to reproduce this problem

标签: python pip virtual-environment flit


【解决方案1】:

pip freeze 的失败确实是 Pip 2.2 中的一个错误。对于即将推出的 Pip 2.3,此错误有 already been fixed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2014-01-24
    • 2021-12-30
    • 2019-06-15
    • 2021-11-05
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多