Python 3.x 安装后,无法导入OpenCV

Python 3.x 安装后,无法导入OpenCV,python-3.x,opencv,ros,Python 3.x,Opencv,Ros,我首先使用这个从源代码安装openCV。 当我测试时,它运行良好 安装后,打开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

我首先使用这个从源代码安装openCV。 当我测试时,它运行良好

安装后,打开
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
Python 3.5.2(默认,2016年11月17日,17:05:23)
[GCC 5.4.0 20160609]在linux上
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口cv2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so:未定义符号:PyCObject_类型

这个问题似乎是由ROS向python路径添加
/opt/ROS/kinetic/lib/python2.7/dist包引起的。当您使用命令
source/opt/ROS/kinetic/setup.bash
激活ROS时,实际上会发生这种情况。这一行通常添加在bashrc文件的末尾,在
/home/username/.bashrc

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


希望有人能想出一个更好的答案,但在那之前这应该是可行的。

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

转到您的站点包文件夹

cd /usr/local/lib/python3.5/site-packages/
请注意,如果您使用的是虚拟环境,则必须在该环境中,并应执行以下操作:

cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
然后,这次使用-f标志强制创建一个新的sym链接

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

这应该可以解决问题

步骤1:找到安装cv2.so的路径(如果使用python cv控制盘安装opencv)

步骤2:将路径导出到.bashrc或.zshrc文件,如下所示:

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

多亏了

事实上,我也遇到了这个问题。我刚刚注释掉了来源:

/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
是安装my python3和
/opt/ros/kinetic/lib/python2.7/dist packages/cv2的路径。因此
是安装
opencv python
的路径

我还不知道为什么这个命令会起作用,但它确实解决了我以前无法导入cv2的问题。

我尝试了 删除
/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so.

现在它正在工作

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


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

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


似乎我的python在导入正确的cv2时遇到了问题,即使路径设置正确,可能是因为python3 cv2库(cv2.cpython-35m-x86_64-linux-gnu.so)的命名很奇怪与cv2.so相比,在运行ros安装程序的过程中,我在/opt/ros/kinetic/lib/python2.7/dist包中运行了
/opt/ros/kinetic/setup.bash
,其他东西之间的脚本将进入python2和python3的每个分发包,并将其添加到python系统路径中。当您尝试使用python3导入
cv2
时,它将首先找到路径中包含的Python2的cv2绑定

如果您不打算为您的ROS项目使用Python 2.7,请考虑完全删除PythON2.7 OpenCV包,这样在运行ROS安装脚本时不会添加到路径:

$rm/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so


如果您计划同时使用这两个Python版本,另一个更温和的方法是创建两个具有正确绑定的虚拟环境,并根据您的需求激活其中一个或另一个。正如其他人所建议的,
/opt/ros/kinetic/setup.bash
PYTHONPATH
变量中为ros opencv追加一条路径

如果您正在使用多个
virtualenv
s,并且您需要一个在大多数情况下都适用的解决方案,那么您可以将以下代码片段放入
.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
都在
~/.virtualenv
下。这将为我们提供所有
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
作为重点
unset PYTHONPATH