默认使用系统PIP而不是虚拟环境PIP?

5 投票
2 回答
3913 浏览
提问于 2025-04-17 12:48

在使用virtualenv和pip几天后,我发现当我激活虚拟环境后,使用的PIP版本其实是全局的PIP,而不是这个虚拟环境里的PIP。这意味着如果你不设置一个环境变量export PIP_RESPECT_VIRTUALENV=true,pip会把新安装的包(比如说用命令pip install argparse)安装到全局环境中,而不是只安装到虚拟环境里。

我本来以为只要激活了虚拟环境,PIP就会默认安装到这个虚拟环境里。

那么,为什么默认情况下不这样工作呢?

想了解PIP_RESPECT_VIRTUALENV是怎么运作的,可以查看这个链接

2 个回答

4

当你创建一个虚拟环境(virtualenv)时,activate 文件里面会把一个叫 VIRTUAL_ENV 的变量固定成你最开始创建这个虚拟环境的文件夹位置。每当你运行 source <your-venv>/bin/activate 时,这个变量就会被使用。

所以,如果你在创建虚拟环境之后移动了这个文件夹,里面固定的路径就会变得不正确。

你只需要用文本编辑器打开 <your-venv>/bin/activate 文件,确保 VIRTUAL_ENV 变量指向你新的虚拟环境文件夹路径:

VIRTUAL_ENV="/Full/path/to/<your-venv>"
export VIRTUAL_ENV

然后再运行一次 source <your-venv>/bin/activate

接下来,你可以用 which pip 来检查 pip 的版本,这样应该会显示:

/Full/path/to/<your-venv>/bin/pip

而不是 /usr/bin/pip/bin/pip 等等。

4

我不是第一次看到有人提到这个问题。我也不太清楚具体发生了什么,但有些人不建议使用 source /path/to/venv/bin/activate,因为这样可能会搞乱你的 $PATH

有一种方法可以让 pip 始终尊重你的虚拟环境:不要依赖 $PATH。可以使用:

/path/to/venv/bin/pip install MYPACKAGE

如果能弄清楚你遇到的问题并把解决办法分享给大家,那就太好了。同时,直接使用 pip 的绝对路径可能也是可以的。

撰写回答