为什么在由pipx创建的虚拟环境中,点列表无法正常工作?

问题描述

我在Linux / Ubuntu系统上,位于pyenv指定为Python 3.8.1的文件夹中。我已经使用pip install pipx安装了pipx。如果我安装了一个应用程序(cowsay),并为该应用程序激活了虚拟环境,则pip会列出我全局安装的软件包。 为什么在激活虚拟环境后为什么看不到Cowsay安装的站点软件包?

您可以从下面的示例中看到,pip list给我相同的结果,而不管virtualenv的激活状态如何?我知道在项目开发期间,这不是观察到的响应。在venv中时,点列表会为我提供在venv中安装的站点软件包。

pipx --verion
0.15.5.1

pip --version    
pip 20.2.3 from /home/steve/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pip (python 3.8)


cd /home/steve/.local/pipx/venvs/
source activate cowsay/bin/activate

(cowsay):~/.local/pipx/venvs$ pip list
Package     Version
----------- --------
argcomplete 1.12.1
click       7.1.2
distro      1.5.0
packaging   20.4
pip         20.2.3
pipx        0.15.5.1
pyparsing   2.4.7
setuptools  41.2.0
six         1.15.0
userpath    1.4.1
(cowsay) :~/.local/pipx/venvs$ deactivate

:~/.local/pipx/venvs$ pip list
Package     Version
----------- --------
argcomplete 1.12.1
click       7.1.2
distro      1.5.0
packaging   20.4
pip         20.2.3
pipx        0.15.5.1
pyparsing   2.4.7
setuptools  41.2.0
six         1.15.0
userpath    1.4.1

解决方法

您的class CollectorUtils { private CollectorUtils() { } public static <T> Collector<T,?,T> onlyElement() { return Collectors.collectingAndThen(Collectors.toList(),Iterables::getOnlyElement); } public static <T> Collector<T,Optional<T>> optionalElement() { return Collectors.collectingAndThen(Collectors.toList(),(list) -> { return Optional.ofNullable(Iterables.getOnlyElement(list,(Object)null)); }); } public static <T> Collector<T,List<T>> toList() { return Collectors.toCollection(ArrayList::new); } } 命令实际上并未使用venv。选中pip会告诉您它在哪里真正解决了。 type pip不会在venv中为pipx创建控制台脚本,因为不需要。

为venv创建的控制台脚本,包括在$ PATH上的pip可执行文件和cowsay符号链接,将位于以下位置:

python

但是用于pip安装的控制台脚本将在$ PATH以外的位置下创建:

~/.local/pipx/venvs/cowsay/bin

您仍然应该能够在实际venv中看到Cowsay lib,如下所示:

~/.local/pipx/shared/bin

您可能想知道为什么python -m pip list python -m pip不工作时为什么起作用?实际上,pip安装是在venvs之间共享的,您应该能够看到在此处进行设置的路径文件hack:

pip