Ubuntu 16下virtualenv显示激活但仍使用主Python的问题排查
这种情况我碰到过好几次,大概率是激活过程的某个环节没走对,咱们一步步排查:
1. 确认虚拟环境是基于Python2.7创建的
Ubuntu 16.04默认虽以Python2.7为系统默认,但如果你的环境里装了Python3,创建虚拟环境时没明确指定版本,virtualenv可能会绑定到Python3上。激活环境后先验证Python版本:
# 激活环境后执行 which python python --version
如果输出不是Python2.7,说明创建环境时版本选错了,得重新来:
# 先退出当前环境 deactivate # 删掉旧环境(如果不需要保留的话) rm -rf your_env_name # 明确指定Python2.7创建新环境 virtualenv -p /usr/bin/python2.7 your_env_name # 重新激活 source your_env_name/bin/activate
2. 检查激活后的PATH环境变量
虚拟环境激活的核心逻辑,是把自身的bin目录放到系统PATH的最优先级位置。激活后执行:
echo $PATH
看输出的最开头是不是你的虚拟环境bin目录(比如/home/your_username/your_env_name/bin)。如果不是,大概率是你执行source时路径错了——比如你没进入环境根目录就直接跑source bin/activate,得先cd到环境文件夹,或者用绝对路径执行激活脚本:source /full/path/to/your_env_name/bin/activate。
3. 验证pip的实际指向
激活环境后执行:
which pip
正常应该指向your_env_name/bin/pip。如果显示的是/usr/bin/pip这类系统路径,要么是激活没生效(回到步骤2查PATH),要么是你给pip设了别名——比如~/.bashrc或~/.zshrc里有alias pip='pip3'的配置。可以先执行unalias pip,再重新检查which pip。
4. 排查shell配置文件的干扰
有些用户会在.bashrc、.bash_profile这类配置文件里手动修改PATH,强行把系统Python路径放到最前面。这种配置会覆盖virtualenv的PATH修改。你可以临时测试:
mv ~/.bashrc ~/.bashrc.tmp # 重启终端,重新激活环境,再查PATH和pip指向
如果问题解决了,就去原来的配置文件里找修改PATH的语句,要么调整顺序,要么加个判断(比如只有虚拟环境未激活时才修改PATH)。
5. 升级virtualenv版本
老版本的virtualenv可能和Ubuntu16.04的Python2.7存在兼容性问题,先升级试试:
pip install --user --upgrade virtualenv
之后重新创建环境再验证。
内容的提问来源于stack exchange,提问作者thebeancounter

