虚拟环境下pip install与python -m pip install行为差异问题排查与解决
pip install与python -m pip install行为不一致的问题排查与解决 我最近在Ubuntu 18.04.5 LTS(Python 3.6.9)上碰到了个挺头疼的问题:用python -m venv创建虚拟环境后,激活环境执行pip install装的包,居然没法被当前虚拟环境的Python识别,但换用python -m pip install就完全正常。之前在其他机器上这俩命令表现一致,折腾了一小时才找到原因,分享给有同样困扰的朋友。
问题复现(基于全新虚拟环境)
- 新建并激活虚拟环境
env1,执行pip install P安装包P - 运行
python尝试import P,直接提示模块不存在 - 退出虚拟环境后执行
python导入P,依旧提示缺失 - 改用
python -m pip install P安装后,虚拟环境内可以正常导入P
排查过程
激活环境后我先检查了基础路径:
which pip返回/home/user/env1/bin/pipwhich python返回/home/user/env1/bin/python- 虚拟环境的
bin目录还在$PATH的最前面,理论上两者应该对应同一个环境才对。
于是我用type -a命令查看了python和pip的所有可用路径:
未激活环境时执行:
type -a python pip
输出:
python is aliased to `/usr/bin/python3'
python is /usr/bin/python
bash: type: pip: not found
激活env1后执行:
type -a python pip
输出:
python is aliased to `/usr/bin/python3'
python is /home/user/env1/bin/python
python is /usr/bin/python
pip is /home/user/env1/bin/pip
再查看pip脚本的shebang行:
head -1 $(which pip)
输出:
#!/home/user/env1/bin/python3
问题根源与解决
原来系统存在一个全局的python别名,指向/usr/bin/python3,而虚拟环境里的pip脚本用的是python3作为解释器。当执行pip install时,虽然pip是虚拟环境里的,但它调用的是别名指向的系统python3,而非虚拟环境内的Python,导致包根本没装到虚拟环境里,自然没法被识别。
删除这个系统级的python别名后,pip install和python -m pip install的行为就完全一致了——都会把包安装到当前激活的虚拟环境中,导入也正常了。
内容的提问来源于stack exchange,提问作者Antonio Sesto

