问题描述
我在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