‘pip check’功能是否异常?多设备出现依赖检测异常问题
嘿,我看你遇到的情况是用virtualenv --system-site-packages建了虚拟环境,但不管怎么激活,装包还是跳去系统目录找已有的依赖,还有python-dateutil的版本依赖问题对吧?这事儿我之前也碰过,给你捋捋原因和解决办法:
为啥会这样?
你加了--system-site-packages参数的话,这个虚拟环境其实是共享系统全局的site-packages依赖的,相当于系统里装过的包,虚拟环境直接拿来用,所以pip install six才会提示已经在/usr/lib/python2.7/dist-packages里存在,pip check结果也跟全局环境一模一样——说白了这个环境没做到真正隔离。
怎么解决?
1. 建个完全干净的虚拟环境(最推荐)
要是你不需要用到系统里的包,直接删掉现有环境,重新建个不带--system-site-packages的:
# 先把旧环境删了 rm -rf ~/env # 建纯净独立的虚拟环境 virtualenv ~/env # 激活环境 source ~/env/bin/activate
这样新环境完全独立,安装的包都会存在~/env/lib/pythonX.X/site-packages目录下,跟系统包彻底分家,不会再有冲突。
2. 强制在虚拟环境里重装依赖(适合必须用系统包的场景)
如果非得保留--system-site-packages参数,但想让某些包优先使用虚拟环境内的版本,就用--ignore-installed参数强制重新安装:
# 把six装到虚拟环境里,忽略系统已有的版本 pip install --ignore-installed six
针对python-dateutil 2.7.2的依赖要求,也可以用这个方式安装指定版本:
# 安装符合依赖要求的python-dateutil版本 pip install python-dateutil==2.7.2
要是系统里的版本实在碍事,也可以试试在虚拟环境里先卸载(注意:这步可能影响系统其他依赖程序,谨慎操作):
pip uninstall python-dateutil pip install python-dateutil==2.7.2
3. 确认虚拟环境真的激活了
有时候可能没激活成功,终端提示符要显示(env)前缀才说明环境生效了。要是没显示,重新执行激活命令:
source ~/env/bin/activate
环境变量没加载对的话,也会不小心用到全局的pip和Python。
验证环境是否正常
激活环境后,跑这俩命令确认路径是否正确指向虚拟环境:
# 查看当前pip的路径 which pip # 查看当前Python的路径 which python
正常输出应该是~/env/bin/pip和~/env/bin/python,而不是系统的/usr/bin路径。
内容的提问来源于stack exchange,提问作者Dugas

