问题描述
在MacOS 10.15.7(Python 3.8.6)和Ubuntu 20.04(Python 3.8.5)上,我为正在编写的各种Python脚本安装了各种虚拟环境(均在Git和Github上)。项目将pyproject.toml
与flit
一起使用。我使用以下脚本中使用的模块创建并填充了环境(其中$ 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
都会得到不同的结果:
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无法构建,并出现相同的错误。
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 freeze
,AssertionError
,editable 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 venv
,flit
或其他问题吗?我至少正确地怀疑RTD版本的失败与pip freeze
的失败有关吗?
解决方法
pip freeze
的失败确实是Pip 2.2中的错误。此错误的already been fixed适用于即将发布的Pip 2.3。