1、问题现象,在python3.5环境中导入cv2报错,在python2.7中正常,报错如下:
python
Python 3.6.4 (default, Dec 16 2019, 11:03:42)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
2、解决办法
(1)读取环境变量$PYTHONPATH
bruce@bruce-desktop:~$ echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages
(2)在pathon控制台中查看
bruce@bruce-desktop:~$ python
Python 3.6.4 (default, Dec 16 2019, 11:03:42)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/opt/ros/kinetic/lib/python2.7/dist-packages', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/home/bruce/.local/lib/python3.6/site-packages', '/home/bruce/.local/lib/python3.6/site-packages/mask_rcnn-2.1-py3.6.egg', '/usr/local/lib/python3.6/site-packages']
可以发现,两种方式出现了路径 /opt/ros/kinetic/lib/python2.7/dist-packages ,且其优先级比路径 /usr/local/lib/python3.6/site-packages 高。
我们希望程序优先读取python3.6的库路径,对应有两种方式!
法一:
修改环境变量$PYTHONPATH
仅在当前终端有效的办法:
export PYTHONPATH=/usr/local/lib/python3.6/site-packages
在当前用户下有效的办法:
export PYTHONPATH=/usr/local/lib/python3.6/site-packages:$PYTHONPATH
或者直接打开.bashrc问文件,在末尾添加如下:
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.6/site-packages
修改当前用户的环境变量
当使用命令激活ROS时,即运行 source /opt/ros/kinetic/setup.bash ,ROS会添加 /opt/ros/kinetic/lib/python2.7/dist-packages 到python路径。因此,需要在 .bashrc 文件中注释掉该命令行,即source /opt/ros/kinetic/setup.bash
注释掉,并再次source读取环境变量。
法二:
在python控制台中移除错误路径
bruce@bruce-desktop:~$ python
Python 3.6.4 (default, Dec 16 2019, 11:03:42)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
>>> import sys
>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
>>> import cv2
参考博客:
https://www.cnblogs.com/gdut-gordon/p/9480652.html
https://blog.csdn.net/jasonzzj/article/details/53941147