笔者在尝试在虚拟机上安装opencv时,由于ubuntu自带了两个opencv的原因,不论是直接用源码编译,还是pip下载,都会把opencv安装在默认的python2上,而笔者想把opencv安装在python3上,在尝试了一些网友给出的解决方案后,终于找到了一个能解决这个问题的方法。
一、安装方法
笔者这里采用的安装方法是直接用pip安装,因为笔者只用到python来做opencv,所以用pip安装方便些,也不需要花费太多的时间在编译上。如果之前已经用其他方法安装的建议先删掉,重来一遍!!!
直接在终端键入:
sudo pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
没有pip3的可以先用apt安装一下pip3;代码中间那部分是调用清华源,会加快下载速度,具体看我另一篇博文(博文链接)
因为使用清华源,下载速度很快;安装完成后,打开python3,键入 import cv2
,嗯,喜闻乐见的报错
但你打开python2再来import cv2
,居然有用!!!!非常气人,明明是用pip3安装的,为什么安装到python2上面去了呢?
错误分析
查阅后这里说的是指向性有问题,笔者经过一番研究后发现,是在python的sys路径中没有包含一个so文件,导致python2的优先级总是比python3的优先级高之类的(这一段笔者没有深入研究,可能不对)
解决方案
这里的解决方案是在一个外文网站上提出来的,网址如下:
https://stackoverflow.com/questions/39112321/python-3-5-importerror-dynamic-module-does-not-define-module-export-function-p
网友的解答中提到几种不同的思路,笔者选用了最适合笔者现状的那种。具体图片如下:
他的意思就是要在sys.path中添加一个路径,且这个路径的排名要相对靠前,然后就行了。笔者尝试一番:
真的有用!!!!
>>> import sys
>>> print(sys.path)
['', '/home/riki/google_ws/install_isolated/lib/python2.7/dist-packages', '/home/riki/catkin_ws/devel/lib/python2.7/dist-packages', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
>>> sys.path.insert(1,'/usr/local/lib/python3.5/dist-packages/cv2')
>>> print(sys.path)
['', '/usr/local/lib/python3.5/dist-packages/cv2', '/home/riki/google_ws/install_isolated/lib/python2.7/dist-packages', '/home/riki/catkin_ws/devel/lib/python2.7/dist-packages', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
>>> import cv2
>>>
可以看出,这里是在sys.path的第一个位置插入了一个/usr/local/lib/python3.5/dist-packages/cv2
路径,然后就可以工作了。
### *具体路径怎么查:
*每个人的路径名应该都大同小异,主要核心是你的这个路径它最后指向的是一个叫cv2.cpython-35m-x86_64-linux-gnu.so
的文件,如下图所示
到这里有一次import能成功就很欢喜了,但坏消息是这样的添加的是暂时性的,等你关掉这个终端,就又没有用了,还需要再在sys添加一次路径,所以应该想一个一劳永逸的方法:
第一种:
是网上说的新建一个pth文件,这种方法添加的路径不能保证是排在路径的第一个,所以对我们这种情况来说是没有用的!
第二种:
修改.bashrc文件:在Home文件夹下,按下Ctrl+H,会显示隐藏文件,用gedit打开隐藏文件中的.bashrc文件,在最后一行添加
export PYTHONPATH=/usr/local/lib/python3.5/dist-packages/cv2:$PYTHONPATH
代码中间部分是你上面要插入的sys.path的地址
保存后关闭,在命令行输入
source .bashrc
这句命令的意思是让你上面添加.bashrc文件立马激活,不然要计算机重启才能激活,之后再进入python3中,看一下环境变量,试一下import cv2
OK,到这里可以看到问题完美解决!