为啥 pip 冻结列表“pkg-resources==0.0.0”?

Posted

技术标签:

【中文标题】为啥 pip 冻结列表“pkg-resources==0.0.0”?【英文标题】:Why does pip freeze list "pkg-resources==0.0.0"?为什么 pip 冻结列表“pkg-resources==0.0.0”? 【发布时间】:2016-12-23 20:23:17 【问题描述】:

在 Ubuntu 16.04 上使用 virtualenv 15.0.1 和 Python 3.5.2(均安装有 apt)当我创建并激活新的 Python 虚拟环境时

virtualenv .virtualenvs/wtf -p $(which python3) --no-site-packages
source .virtualenvs/wtf/bin/activate

我得到以下输出:

Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/das-g/.virtualenvs/wtf/bin/python3
Also creating executable in /home/das-g/.virtualenvs/wtf/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

确实 pip freeze --all 列出了这 4 个包:

pip==8.1.2
pkg-resources==0.0.0
setuptools==25.2.0
wheel==0.29.0

不过,我希望pip freeze(没有--all)忽略这些隐式安装的软件包。它确实省略了其中一些,但不是pkg-resources

pkg-resources==0.0.0

(顺便说一句,pip freeze --local

虽然这与帮助文本一致

$> pip freeze --help | grep '\--all'
  --all                       Do not skip these packages in the output: pip, setuptools, distribute, wheel

pip freeze 输出中包含pkg-resources 似乎不是很有用,甚至可能有害。 (我怀疑这就是为什么从pip-tools 运行pip-sync 会从虚拟环境中卸载pkg-resources,从而巧妙地破坏环境。)有什么好的理由为什么pip freeze 列出pkg-resources 而不是省略它,也?据我记得,它没有在 Ubuntu 14.04(使用 Python 3.4)上列出。

【问题讨论】:

我不知道为什么会发生这种情况。这发生在我身上,它使用了一个对我的项目实际上至关重要的不同包。我找到的解决方案是使用 PyPi 上的最新可用版本编辑 requirements.txt。我猜,一种可能是最初安装的版本在 PyPi 上不再可用。 令人惊讶的是还没有答案...... 我创建了一张票,它最终可能会提供答案:github.com/pypa/pip/issues/4022 bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1635463 Debian 错误报告#871790 也是关于这个问题的。 【参考方案1】:

根据https://github.com/pypa/pip/issues/4022,这是由于 Ubuntu 向 pip 提供了不正确的元数据而导致的错误。所以,不,这种行为似乎没有充分的理由。我向 Ubuntu 提交了一个后续错误。 https://bugs.launchpad.net/ubuntu/+source/python-pip/+bug/1635463

【讨论】:

这也会影响 Debian 用户。看起来修复是针对 Ubuntu see the most recent comment of original bug report 和 Debian (#1 #2)。【参考方案2】:

我在虚拟环境中遇到了同样的问题。我用pip uninstall pkg-resources==0.0.0 删除了它

【讨论】:

警告:这可能会巧妙地破坏您的 virtualenv。 @das-g 它会以什么方式破坏 virtualenv? 对不起,我不太记得当时的问题是什么,而且我目前没有方便的 Ubuntu 系统。 IIRC,pkg-resources 是 virtualenv 的一个组成部分,Python、pip 或 virtualenv 本身需要它。不确定什么会在丢失时停止工作。【参考方案3】:

正如其他答案中提到的,这是一个错误。但是,在 linux 上,您可以使用以下命令自动删除包含 pkg-resources==0.0.0 的行。

$ pip freeze > requirements.in && grep -v "pkg-resources==0.0.0" requirements.in > temp && mv temp requirements.in

【讨论】:

以上是关于为啥 pip 冻结列表“pkg-resources==0.0.0”?的主要内容,如果未能解决你的问题,请参考以下文章

pip freeze 命令输出中的“pkg-resources==0.0.0”是啥

点冻结与点列表

使用 pip install 时,为啥 (from versions: xxx) 的列表很短?

如何冻结 pip 安装包的要求?

python Coppre输出2个pip冻结命令

为什么pip安装包不会出现在pip冻结中?