安装 ROS Kinetic 后,无法导入 OpenCV

Posted

技术标签:

【中文标题】安装 ROS Kinetic 后,无法导入 OpenCV【英文标题】:After install ROS Kinetic, cannot import OpenCV 【发布时间】:2017-08-18 14:22:38 【问题描述】:

我首先使用 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

【问题讨论】:

你的 python3 正在尝试加载 python2 模块?!您可以运行以下命令并将输出粘贴到您的问题中吗?:ldd /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.soecho $PYTHONPATH,(在 pythonconsole 中)import sys; print(sys.path) 【参考方案1】:

看起来这个问题是由ROS将/opt/ros/kinetic/lib/python2.7/dist-packages添加到python路径引起的。这实际上是在您使用命令source /opt/ros/kinetic/setup.bash 激活 ROS 时发生的。此行通常添加在 bashrc 文件的末尾,/home/username/.bashrc

解决方法是从 bashrc 文件中删除这一行。这样,python3 opencv 包将被正确使用,您仍然可以运行source /opt/ros/kinetic/setup.bash 来使用 ROS。但是,这确实意味着您不能在同一环境中使用 ROS 和 python3。

希望有人能提出更好的答案,但这应该在那之前有效。

【讨论】:

我的解决方法不是删除 ROS 添加的 python 路径,而是将 anaconda 附加到它的路径,例如 `export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-包:$PYTHONPATH" ` 嗨。我已经从我的 bashrc 文件中注释了这一行,并在我的代码中添加了 sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages/')。当我打印路径时它没有显示,但在我导入 cv2 时仍然会造成问题。你能帮忙吗?【参考方案2】:

如果您正在使用 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')

在 anaconda3 上使用 python3.5 和本地编译的 opencv 进行测试。这可能也适用于virtualenvs

对于永久解决方案,请按照@Paul 的回答中所述,从~/.bashrc 中删除路径'/opt/ros/kinetic/lib/python2.7/dist-packages'

【讨论】:

print(sys.path) 而不是 print('sys.path') 这不是一个永久的解决方案,因为我需要 ros 和 python3 @Mehdi 为什么投反对票? Paul 的回答最初提供的“永久”解决方案确实允许同时使用 ROS 和 python3。您可以针对您的具体问题提出新问题或撰写建设性评论,以便获得帮助。 我在我的~/.bashrc 脚本中没有找到/opt/ros/kinetic/lib/python2.7/dist-packages 行... 它只提供这两个文件:source /opt/ros/kinetic/setup.bash source ~/catkin_ws/devel/setup.bash... 知道 ROS 在哪里潜入并更改了我的系统。小路?谢谢!【参考方案3】:

正如所指出的,.bashrc 中的source /opt/ros/kinetic/setup.bash 命令将PYTHONPATH 修改为:

> echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages

在我的例子中,由于我在 Python 3 项目中使用了 virtualenv,所以我只是运行以下命令来清除 PYTHONPATH 变量,同时激活 virtualenv。

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
...

【讨论】:

这很简单,但是很好的解决方案!谢谢。【参考方案4】:

遇到了完全相同的问题。问题是 ROS 为 python 2 创建了它自己的 cv2.so 文件,然后将每个导入请求路由到该文件。这是一个非常简单的解决方法:

转到您的站点包文件夹

cd /usr/local/lib/python3.5/site-packages/

注意,如果您使用的是虚拟环境,则必须在其中,并且应该执行以下操作:

cd ~/.virtualenvs/cv/lib/python3.5/site-packages/

然后,这次使用 -f 标志强制一个新的符号链接

ln -sf /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

这应该可以解决问题!

【讨论】:

能否在最后一行代码中问一下,源是什么,目的是什么?是源=虚拟环境站点包,目的地在哪里?谢谢..【参考方案5】:

如果这些解决方案都不适合您(如我的情况),您仍然可以尝试欺骗您的系统导入正确的 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

【讨论】:

拯救了我的一天!谢谢。 太棒了!伟大的工作:) 在 python 3.7 上 sys.path.remove() 应该替换为 sys.path.remove(ros_path)【参考方案6】:

Step1:找到你的cv2.so的安装路径(如果你用python-cv***安装opencv的话)

Step2:将路径导出到您的 .bashrc 或 .zshrc 文件,如下所示:

export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-package‌​s:$PYTHONPATH"

感谢@lxrd-aj

【讨论】:

【参考方案7】:

我尝试过 删除/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so. 现在它正在工作。

【讨论】:

【参考方案8】:

其实我也遇到过这个问题。我只是注释掉了来源:

/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.soopencv-python的安装路径。

我还不知道为什么这个命令有效,但它确实解决了我之前无法导入 cv2 的问题。

【讨论】:

而在我执行之后,/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so 中的 cv2.so 变成了一个断开的链接。【参考方案9】:

在运行/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 版本,另一种更温和的方法是创建两个具有正确绑定的虚拟环境,并根据您的要求激活一个或另一个。

【讨论】:

这对我有用。我仍然能够在 Python2 和 Python3 中导入 cv2 和 rospy。删除这个仅仅意味着你必须使用你自己安装的opencv,这可以通过pip来完成。【参考方案10】:

这里有类似的问题。正如其他人所建议的那样,/opt/ros/kinetic/setup.bashPYTHONPATH 变量中附加了指向 ROS opencv 的路径。

如果您正在使用多个virtualenvs,并且您需要一个适用于大多数情况的解决方案,那么您可以将以下代码 sn-p 放入您的.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

所以我们的想法是,如果您有一个包含所有 virtualenvs 的集中目录(例如,当您使用 virtualenvwrapper 时),我们可以使用以下方法搜索这些目录:

$(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d)

鉴于我们所有的virtualenvs 都在~/.virtualenvs 之下。这应该会为我们提供所有 virtualenvs 根目录的列表。

然后我们循环遍历 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

【讨论】:

【参考方案11】:

我之前在 Ubuntu 16.04 上安装了 ROS 和 catkin_tools,突然遇到了同样的问题。 修复它的工作如下:

    导航到主目录 在编辑器中打开.bashrc(通常默认情况下此文件是隐藏的;如果是,请按ctrl + h使其可见) 注释掉或删除source /opt/ros/kinetic/setup.bashsource ~/catkin_ws/devel/setup.bash 这两行。通过将# 放在两行前面来注释掉作品。 保存文件 重启电脑

完成。

【讨论】:

【参考方案12】:

您可以暂时删除 ROS PATHimport cv2

这是我解决该问题的解决方案:

try:
    import cv2
except ImportError:
    import sys
    ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
    sys.path.remove(ros_path)
    import cv2
    sys.path.append(ros_path)

【讨论】:

以上是关于安装 ROS Kinetic 后,无法导入 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

按照 ROS 教程将 ROS Kinetic 安装到 Mac

Ubuntu零基础教学-解决Ubuntu安装ros报错E: Unable to locate package ros-kinetic-desktop-full问题

Ubantu18安装ROS Kinetic,排除很多的坑

在树莓派上安装 ROS 包

ROS Kinetic的安装与配置,

ROS Kinetic的安装与配置,