解决OpenCV重装后Python下import cv2错误问题

    本文是博主解决问题过程中所产生的一些想法,分享出来,希望能帮到一些朋友。不足之处,还望各位大佬不吝赐教。

【前提】

    博主在Ubuntu服务器上安装了OpenCV4.0版本,Python环境下可以运行,如图1。某天在部署YOLO3的时候,程序跳出error: #error "OpenCV 4.x+ requires enabled C++11 support"错误。顾名思义:OpenCV 4.x +需要启用C ++ 11支持。此处应该有更优的解决方式,当时脑子一热,决定重新安装OpenCV3.4的。参考https://blog.csdn.net/cocoaqin/article/details/78163171教程装好之后,YOLO顺利执行,随后删除掉OpenCV4.0版本的相关文件。这时在python环境下导入cv2模块出错,报ImportError: libopencv_ml.so.4.0: cannot open shared object file: No such file or dicectory错误,如图2。

解决OpenCV重装后Python下import cv2错误问题
图1  初始状态OpenCV正常运行

 

解决OpenCV重装后Python下import cv2错误问题
图2 重装OpenCV后Python环境下出错

 【猜想】

    Python环境下import cv2模块其实导入的是编译OpenCV生成的.so文件,即cv2.so文件。既然导入cv2模块输出缺少4.0版本的文件,那么博主猜想此时导入的.so文件仍然是OpenCV4.0版本编译生成的。目标就是找到最新生成的.so文件并替换之前的版本。

【尝试】

    求助度娘之后,发现一种修改配置文件的方式,添加PYTHONPATH变量到~/.bashrc文件中,这种方式其实就是告诉Python到指定的地址下去寻找模块,一般用于导入自定义模块(读者可以了解一下sys.path和PYTHONPATH的相关知识)。因为OpenCV编译后的cv.so文件位于/usr/local/lib/python3.6/dist-packages路径下,所以在~/.bashrc文件最后添加export PYTHONPATH=/usr/local/lib/python3.5/dist-packages:$PYTHONPATH,让Python到该路径下查找。更改后运行source ~/.bashrc立即生效。import cv2,报出如下错误:AttributeError: module 'enum' has no attribute 'IntFlag',图3所示:

解决OpenCV重装后Python下import cv2错误问题
图3 尝试后出错

 

    这个错误让博主一头雾水,原来enum模块原本导入的是/usr/lib/python3.6/enum.py文件,/usr/local/lib/python3.5/dist-packages路径下有同名文件夹,博主修改了配置文件导致了/usr/local/lib/python3.6/dist-packages路径的优先级高于/usr/lib/python3.6/,从而导入错误的模块而忽略了正确的模块。

    博主在删除配置文件中PYTHONPATH值之后,通过import sys模块,使用sys.path语句输出Python到哪些路径下寻找导入的模块。输出结果如下图4所示:

解决OpenCV重装后Python下import cv2错误问题
图4 sys.path

   竟然发现/usr/local/lib/python3.6/dist-packages路径原本就在,看来这个方法是不行了。

【解决】

    这时博主找朋友借了一个服务器账号(单位内部服务器,大家的账号初始设置相同),Python环境下使用imp模块实现import过程,看看cv2模块到底在什么地方,使用imp.find_module("cv2")方法,输出如图5:

解决OpenCV重装后Python下import cv2错误问题
图5 cv2模块确切位置

    发现cv2模块居然是/usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so文件,而且,需要注意的是,这里的cv2.cpython-36m-x86_64-linux-gnu.so文件就是上文所说的cv2.so文件(不知道咋改名了,让我好找)。后面就好办了,新安装的OpenCV编译产生的cv2.cpython-36m-x86_64-linux-gnu.so文件在/usr/local/lib/python3.6/dist-packages/路径下,找到该文件,替换掉/usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so就行了。

    再次运行,成功!

解决OpenCV重装后Python下import cv2错误问题
图6 成功导入