Python导入模块的搜索路径以及优先级问题
问题背景System:ubuntu16.04
Software:python2.7(系统预装)
问题描述:
在运行.py或者使用python交互环境import cv2时始终导入的是某些blog在import cv2出错时推荐安装的opencv-python(前提我已经设置好了PYTHONPATH)而不是我自己源码编译的opencv。初步怀疑是搜索路径的优先级问题,但是PYTHONPATH优先级确实比默认安装路径要高,费解!
解决步骤
将自己opencv的安装路径加入到最高优先级(list的第一个元素),验证是否为搜索路径优先级导致。
sys.path.insert(0,'${opencv_install}/lib/python2.7/dist-packages/')
import cv2
print cv2.__file__
结论:能正确找到自己编译的opencv,确实是优先级问题,新的问题来了PYTHONPATH优先级确实比默认安装路径要高,为什么还会找到默认安装路径的opencv-python?
打印出sys.path检查,发现在当前路径' '和PYTHONPATH中插入了一部分路径,这部分路径中居然含有'/usr/local/lib/python2.7/dist-packages',罪魁祸首找到了,opencv-python所在的默认安装路径在PYTHONPATH前面,所以每次都找到opencv-python这个模块。
要解决这个问题就得弄明白这部分路径是怎么被添加到sys.path?
百度…有很多帖子,但好像没说到这个问题! bing…有很多相关问题,看了几个都没找到原因!直到下午才发现Stack Overflow上的一样的问题,问这部分路径哪来的,不多说上菜!Where is Python’s sys.path initialized from? - Stack Overflow ,其中高票答案的评论以及第二高票答案均提及site.py,再回去仔细Python官方文档28.1. sys — System-specific parameters and functions — Python 2.7.15 documentation,果然有新发现:
注意看黄底部分,有一个site模块也会在启动时会自动加载一些路径到sys.path,该模块通过读取指定目录中的XXX.pth文件来添加对应路径!!!
关于site模块的细节不想写了,有兴趣的自己看官方文档,因为写文档太耗时了,写了也不一定有人会看,看了也不一定会关注…
解决问题
在/usr/local/lib/python2.7/dist-packages/easy-install.pth文件中找到了被添加PYTHONPATH之前的'/usr/local/lib/python2.7/dist-packages',把这一句注释掉,问题解决!
总结
问题:
在系统Python的安装位置的/usr/local/lib/python2.7/dist-packages/easy-install.pth文件中有一行'/usr/local/lib/python2.7/dist-packages'被添加在PYTHONPATH之前,导致import cv2时只能找到pip安装的opencv-python模块,自行编译安装在其他地方的cv2找不到!
经验:
上接背景知识,Python按照sys.path列表搜索模块,site模块也会自动将XXX.pth中的路径加载在sys.path中,且可能位于PYTHONPATH之前。
这个问题也启发我们,除了PYTHONPATH,我们还可以利用上面site模块作用,通过在指定位置添加XXX.pth来指定自己编译的模块路径,当然是建议在自己用户目录下~/.local/lib/python2.7/site-packages/啦!
例如:某些自己编译的模块如cv2,不能同时用于python2和3,而PYTHONPATH是共享的。为了不相互干扰就可以利用XXX.pth来指示路径!案例:python - how to set different PYTHONPATH variables for python3 and python2 respectively - Stack Overflow
---------------------
作者:csdnromme
来源:CSDN
原文:https://blog.csdn.net/qq_38156052/article/details/81130117
版权声明:本文为博主原创文章,转载请附上博文链接!
页:
[1]