【问题标题】:why pip freeze returns some "gibberish" instead of package==VERSION?为什么 pip freeze 返回一些“乱码”而不是 package==VERSION?
【发布时间】:2021-01-19 11:50:41
【问题描述】:

这是我所做的:

❯ pip freeze
aiohttp @ file:///Users/aiven/Library/Caches/pypoetry/artifacts/50/32/0b/b64b02b6cefa4c089d84ab9edf6f0d960ca26cfbe57fe0e693a00912da/aiohttp-3.6.2-py3-none-any.whl
async-timeout @ file:///Users/aiven/Library/Caches/pypoetry/artifacts/0d/5d/3e/630122e534c1b25e36c3142597c4b0b2e9d3f2e0a9cea9f10ac219f9a7/async_timeout-3.0.1-py3-none-any.whl
attrs @ file:///Users/aiven/Library/Caches/pypoetry/artifacts/7f/e7/44/32ca3c400bb4d8a2f1a91d1d3f22bbaee2f4727a037aad898fbf5d36ce/attrs-20.2.0-py2.py3-none-any.whl
chardet @ file:///Users/aiven/Library/Caches/pypoetry/artifacts/c2/02/35/0d93b80c730b360c5e3d9bdc1b8d1929dbd784ffa8e3db025c14c045e4/chardet-3.0.4-py2.py3-none-any.whl
...

pip 版本:

❯ pip -V
pip 20.2.3 from /Users/aiven/projects/foobar/venv/lib/python3.8/site-packages/pip (python 3.8)

我希望是这样的:

> pip freeze
foo==1.1.1
bar==0.2.1

pip freeze -h 不是很有帮助...

对于上下文:我使用 poetry 将软件包安装到 virtualenv 中。

【问题讨论】:

  • 你是如何运行 pip 的?由于 Poetry 会在您通过它运行命令时根据需要创建和调用环境,因此您必须运行 poetry run pip freeze 才能看到正确的环境...?!
  • 如果你不能解决它,你仍然可以暂时通过查看输出中每一行的末尾来获取版本和包名称
  • poetry run pip freeze 返回了相同的内容。这是我第一次遇到这种行为......
  • 可能是诗歌的罪魁祸首(它是缓存魔法)。 pip freeze --all 返回了一些普通版本的包,而不是指向轮子的指针。

标签: python pip python-poetry


【解决方案1】:

这似乎来自支持PEP 610 的更改。特别参考Freezing an environment section。 “冻结”的概念已扩展为包括为使用直接来源安装的软件包保留直接 url 源。

Poetry,1.1.0 引入了 new installer,现在可以处理依赖项的发现和下载工件。这与1.0.10 中的行为不同,后者只是让pip 处理所需工件(轮子)的发现和下载。这意味着,现在软件包是使用直接 URL 来源安装的。这会导致pip freeze 使用PEP 508 中指定的直接引用格式(例如:package @ file://../package.whl)。对于那些感兴趣的人,有问题的 url 将保存在虚拟环境站点目录中的<package>-<version>.dist-info/direct_url.json 中。

您可以使用以下命令获取旧格式输出(不确定将来是否会更改)。

pip --disable-pip-version-check list --format=freeze

【讨论】:

  • 不那么冗长且更容易记住的是pip list --format=freeze。见pip/Issue#8176
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 2019-12-17
  • 2018-06-22
  • 2015-02-26
  • 2022-08-10
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多