为什么 pip list 在 pipx 创建的虚拟环境中不能正常工作?

Why does pip list not work correctly within a virtual environment created by pipx?

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

你可以从下面的例子中看出,无论 virtualenv 的激活状态如何,pip list 都会给我相同的结果?我知道在项目开发期间,这不是观察到的响应。在 venv 中时,pip list 为我提供了安装在 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

您的 pip 命令实际上并未使用 venv。检查 type pip 会告诉您真正解决的地方。 pipx 不会在 venv 中为 pip 创建控制台脚本,因为没有必要。

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

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

但是 pip 安装的控制台脚本将创建在不在 $PATH 上的位置:

~/.local/pipx/shared/bin

您应该仍然能够像这样在实际的 venv 中看到 cowsay 库:

python -m pip list

您可能想知道为什么 python -m pip 有效而 pip 无效?事实上,pip 安装是在 venvs 之间共享的,你应该能够在这里看到设置它的路径文件 hack:

~/.local/pipx/venvs/cowsay/lib/python3.8/site-packages/pipx_shared.pth