我首先使用此script从源代码安装openCV。 当我测试时它运行良好。
安装ROS kinetic后,打开python3
并运行import cv2
,出现以下错误:
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[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
答案 0 :(得分:15)
看起来这个问题是由ROS将/opt/ros/kinetic/lib/python2.7/dist-packages
添加到python路径引起的。当您使用命令source /opt/ros/kinetic/setup.bash
激活ROS时,实际上会发生这种情况。此行通常在/home/username/.bashrc
的bashrc文件末尾添加。
解决方法是从bashrc文件中删除此行。这样就可以正确使用python3 opencv包,你仍然可以运行source /opt/ros/kinetic/setup.bash
来使用ROS。但是,这确实意味着您无法在同一环境中使用ROS和python3。
希望有人可以提出更好的答案,但这应该会有效。
答案 1 :(得分:12)
如果您正在使用anaconda,请激活您想要使用的环境,并从sys.path
中移除罪魁祸首。
为此,打开一个python3控制台,其中包含:
>>> import sys
>>> print(sys.path)
您将看到几条路径,其中您应该注意:
'/opt/ros/kinetic/lib/python2.7/dist-packages'
然后删除它:
>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
使用本地编译的opencv在anaconda3上使用python3.5进行测试。这也可能适用于virtualenvs
。
要获得永久性解决方案,请从@ {Paul的回答中提及的'/opt/ros/kinetic/lib/python2.7/dist-packages'
中删除路径~/.bashrc
。
答案 2 :(得分:7)
有完全相同的问题。问题是ROS为python 2创建了自己的cv2.so文件,然后将每个导入请求路由到该文件。这是一个非常简单的解决方法:
转到您的site-packages文件夹
cd /usr/local/lib/python3.5/site-packages/
请注意,如果您使用的是虚拟环境,则必须使用虚拟环境,而应该执行以下操作:
cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
然后,这次使用-f标志强制一个新的sym-link
ln -sf /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
那应该解决问题!
答案 3 :(得分:5)
步骤1:找到安装cv2.so的路径(如果使用python-cv轮安装opencv)
步骤2:将路径导出到.bashrc或.zshrc文件,如下所示:
export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-packages:$PYTHONPATH"
感谢@lxrd-aj
答案 4 :(得分:4)
我试过
删除/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so.
现在它正在运作。
答案 5 :(得分:2)
实际上,我也遇到过这个问题。我刚刚评论了消息来源:
/opt/ros/kinetic/setup.bash
然后,打开终端,在我执行的anaconda lib路径中:
sudo ln -sf /home/apg/miniconda3/lib/python3.6/site-packages/cv2.so /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
/home/apg/miniconda3
是我安装python3的路径,/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
是安装opencv-python
的路径。
我不知道为什么这个命令有效,但它确实对我解决了以前我无法导入cv2的问题。
答案 6 :(得分:2)
如果这些解决方案都不适合您(如我的情况),您仍然可以尝试诱使系统导入正确的opencv
ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
if ros_path in sys.path:
sys.path.remove()
import cv2
sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')
也许您可能会考虑在导入cv2之后在正确的位置替换ros python路径。
即使路径设置正确,似乎我的python还是无法导入正确的cv2,这可能是因为python3 cv2库(cv2.cpython-35m-x86_64-linux-gnu.so)的命名很奇怪我在/opt/ros/kinetic/lib/python2.7/dist-packages中找到了cv2.so
答案 7 :(得分:1)
在运行/opt/ros/kinetic/setup.bash
的ROS设置期间,其他脚本之间的脚本将进入python2和python3的每个分发包,并将其添加到python系统路径中。当您尝试使用python3导入cv2
时,它将首先找到该路径中包含的Python2的cv2绑定。
如果您根本不打算为ROS项目使用python2.7,请考虑完全删除python2.7 OpenCV软件包,因此在运行ros设置脚本时不会将其添加到路径中:
$ rm /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so
如果打算同时使用两个Python版本,则另一种更为温和的方法是使用正确的绑定创建两个虚拟环境,然后根据需要激活一个或另一个。
答案 8 :(得分:0)
这里有类似的问题。正如其他人建议的那样,/opt/ros/kinetic/setup.bash
在变量PYTHONPATH
中向ROS opencv附加了路径。
如果您要使用多个virtualenv
,并且需要在大多数情况下都可以使用的解决方案,则可以将以下代码段放入.bashrc
中:
source /opt/ros/kinetic/setup.bash
array=( $(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d) )
for i in "${array[@]}"
do
export PYTHONPATH="$i/lib/python2.7/site-packages:$PYTHONPATH"
done
因此,我们的想法是,如果您拥有所有virtualenv
的集中目录(例如,当您使用virtualenvwrapper
时),我们可以使用以下方法搜索这些目录:
$(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d)
假设我们所有的virtualenv
都在~/.virtualenvs
下。这应该给我们所有virtualenv
根目录的列表。
然后,我们遍历virtualenv目录数组,并将其路径(例如~/.virtualenvs/testenv/lib/python2.7/site-packages
)附加到PYTHONPATH
。请注意,应该在source /opt/ros/kinetic/setup.bash
之后之后完成该操作。
这不是完美的解决方案,因为如果两个环境具有不同的opencv版本,您仍然会发生冲突,但是对于最初的问题,至少它应该可以工作。
或者,您可以手动对所需的virtualenv执行相同的技巧:
export PYTHONPATH=~/.virtualenvs/testenv/lib/python2.7/site-packages:$PYTHONPATH
答案 9 :(得分:0)
如前所述,您的source /opt/ros/kinetic/setup.bash
中的.bashrc
命令将PYTHONPATH
修改为:
> echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages
在我的情况下,由于我为Python 3项目使用了virtualenv,因此我在启用virtualenv的同时运行了以下命令来清除PYTHONPATH
变量。
unset PYTHONPATH
现在,在Python 3 virtualenv中导入cv2
可以正常工作。我验证了cv2
的路径:
In [1]: import cv2
In [2]: cv2.__file__
Out[2]: '<path_to_virtualenv>/lib/python3.5/site-packages/cv2/cv2.cpython-35m-x86_64-linux-gnu.so'
为避免每次激活该virtualenv时都必须运行此命令,我将其添加到virtualenv目录中的/bin/activate
文件中,如下所示:
...
# unset irrelevant variables
deactivate nondestructive
unset PYTHONPATH
VIRTUAL_ENV="/home/kaiyuzh/pyenv/py3"
export VIRTUAL_ENV
...
答案 10 :(得分:0)
我以前在Ubuntu 16.04上安装了ROS和catkin_tools,突然遇到了同样的问题。 对其进行修复如下:
.bashrc
(通常默认情况下隐藏此文件;如果是这样,请按ctrl + h
将其显示)source /opt/ros/kinetic/setup.bash
和source ~/catkin_ws/devel/setup.bash
两行。通过将#
放在相应两行的前面来注释掉作品。 完成。
答案 11 :(得分:0)
您可以暂时删除 ROS PATH 和 import cv2
。
这是我处理该问题的解决方案:
import sys
try:
import cv2
except ImportError:
ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
sys.path.remove(ros_path)
import cv2
sys.path.append(ros_path)