默认使用系统PIP而不是虚拟环境PIP?
在使用virtualenv和pip几天后,我发现当我激活虚拟环境后,使用的PIP版本其实是全局的PIP,而不是这个虚拟环境里的PIP。这意味着如果你不设置一个环境变量export PIP_RESPECT_VIRTUALENV=true
,pip会把新安装的包(比如说用命令pip install argparse)安装到全局环境中,而不是只安装到虚拟环境里。
我本来以为只要激活了虚拟环境,PIP就会默认安装到这个虚拟环境里。
那么,为什么默认情况下不这样工作呢?
想了解PIP_RESPECT_VIRTUALENV
是怎么运作的,可以查看这个链接。
2 个回答
当你创建一个虚拟环境(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
等等。
我不是第一次看到有人提到这个问题。我也不太清楚具体发生了什么,但有些人不建议使用 source /path/to/venv/bin/activate
,因为这样可能会搞乱你的 $PATH
。
有一种方法可以让 pip 始终尊重你的虚拟环境:不要依赖 $PATH
。可以使用:
/path/to/venv/bin/pip install MYPACKAGE
如果能弄清楚你遇到的问题并把解决办法分享给大家,那就太好了。同时,直接使用 pip 的绝对路径可能也是可以的。