安装 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.so
,echo $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-packages:$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.so
是opencv-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.bash
在PYTHONPATH
变量中附加了指向 ROS opencv 的路径。
如果您正在使用多个virtualenv
s,并且您需要一个适用于大多数情况的解决方案,那么您可以将以下代码 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
所以我们的想法是,如果您有一个包含所有 virtualenv
s 的集中目录(例如,当您使用 virtualenvwrapper
时),我们可以使用以下方法搜索这些目录:
$(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d)
鉴于我们所有的virtualenv
s 都在~/.virtualenvs
之下。这应该会为我们提供所有 virtualenv
s 根目录的列表。
然后我们循环遍历 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.bash
和source ~/catkin_ws/devel/setup.bash
这两行。通过将#
放在两行前面来注释掉作品。
保存文件
重启电脑
完成。
【讨论】:
【参考方案12】:您可以暂时删除 ROS PATH 和 import 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问题