自8月中旬以来创建的Python虚拟环境引发了针对“ python3 -m pip冻结”的“ AssertionError”

问题描述

在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月17日之前具有较新环境的项目的文档却未能建立。在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无法构建,并出现相同的错误

当我使用7月份创建的虚拟环境时,

pip freeze >requirements.txt可以正常工作。但是,当我在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的失败有关吗?

解决方法

pip freeze的失败确实是Pip 2.2中的错误。此错误的already been fixed适用于即将发布的Pip 2.3。