多Python版本环境下执行pip出现ImportError问题求助
错误原因分析
从你的报错信息能一眼定位问题核心:你调用的pip3居然在加载Python2.7的包目录(/usr/local/lib/python2.7/dist-packages),这说明pip3和Python3的关联彻底被搞乱了。
大概率是之前你用Python2的pip安装或更新过pip工具,导致/usr/local/bin下的pip3脚本被错误绑定到了Python2环境。加上/usr/local/bin的执行优先级通常高于/usr/bin,所以你运行pip3时,实际调用的是这个关联错误的版本——而Python2版本的pip(9.0.1)里并没有HashMissing这个类,自然就抛出了ImportError。
再加上你系统里同时装了Python2/3且没使用虚拟环境,多个版本的Python和pip散落在/usr/bin和/usr/local/bin,进一步加剧了这种混乱。
分步解决办法
1. 先确认当前pip的关联情况
先执行这几个命令,明确每个pip工具绑定的Python版本,验证我们的判断:
pip --version pip2 --version pip3 --version
你应该会看到pip3显示的是Python2.x,这就坐实了关联错误的问题。
2. 重新将pip3绑定到Python3
最直接有效的办法是用Python3本身来安装/修复pip3,确保关联绝对正确:
# 用系统默认的Python3执行,也可以指定具体版本比如python3.4或python3.5 python3 -m pip install --upgrade pip # 或者指定具体的Python3版本 python3.5 -m pip install --upgrade pip
这个命令会强制用Python3的模块系统更新pip3,直接覆盖掉之前错误关联的脚本。
3. (可选)清理混乱版本+统一管理默认工具
如果/usr/local/bin里的pip版本太杂,你可以清理掉多余的(先确认后再执行):
# 删除绑定Python2的pip(先通过pip --version确认后再操作) rm /usr/local/bin/pip
另外,推荐用update-alternatives统一管理Python和pip的默认版本,彻底避免以后再出类似问题:
# 配置Python的可选版本,数字代表优先级 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 2 # 选择默认Python版本 sudo update-alternatives --config python # 同理配置pip的可选版本 sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip2 1 sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 2 # 选择默认pip版本 sudo update-alternatives --config pip
4. 验证修复结果
重新执行pip3 --version,应该显示绑定的是Python3.x,然后试试pip3 freeze或pip3 list,确认报错消失。
内容的提问来源于stack exchange,提问作者jefferyear




