在python3上导入cv2

时间:2018-07-29 09:37:44

标签: python-3.x opencv

当我从主文件夹运行cv2时,尝试在python3中导入cv2时遇到问题...

luis@luis-Ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[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
>>> 

但是当我在/ usr / lib / python3 / dist-packages或/usr/local/lib/python3.5/dist-packages路径中运行python3时,效果很好...

luis@luis-Ubuntu:~$ cd /usr/lib/python3/dist-packages
luis@luis-Ubuntu:/usr/lib/python3/dist-packages$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 

我知道这与在sys库中包含路径有关, 我在〜/ .bashrc上添加了导出PYTHONPATH,但没有解决问题...

export PYTHONPATH="/usr/local/lib/python3.5/dist-package‌​s:$PYTHONPATH"

我还发现,如果我在导入cv2之前插入路径,它可以工作,但是我需要在所有脚本上执行此操作,或者每次从终端运行python3时都要执行此操作...

luis@luis-Ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[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.insert(0,'/usr/lib/python3/dist-packages')
>>> import cv2
>>> 

但我想永久解决此问题,有人知道如何解决此问题吗? btw ...在python2上运行良好...

3 个答案:

答案 0 :(得分:0)

从您提供的print(sys.path)

...'/opt/ros/kinetic/lib/python2.7/dist-packages'...

我认为问题出在这个项目上。尽管python3路径也位于sys.path中,但是python2.7路径在它之前。 Python将首先捕获python2.7中的一个。当您直接在/python3/dist-packages内部运行时,当前目录位于python2.7之前。

我认为有两种方法:

  1. 从您的python2.7/dist-packages中删除PYTHONPATH
  2. 在导入sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')之前先致电cv2。参见this question

第一种方法应该是“正确”的方法,但是如果您想同时使用两个python2 / 3,我不确定如何处理。您可能对this post感兴趣。

答案 1 :(得分:0)

此问题的根源是bashrc文件source/opt/ros/kinetic/setup.bash中的ROS命令,例如/home/username/.bashrc,这些命令会强制更改Python路径。即使您没有使用ROS,命令仍然会执行,因此您将被引导在ROS文件夹的/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so中找到cv2,该文件夹与Python 3不兼容。 : After install ROS Kinetic, cannot import OpenCV 。在这里,我提出了另一种解决方案,该职位没有任何答案。

想法是仅在使用ROS时运行source/opt/ros/kinetic/setup.bash(以及与ROS相关的任何其他bash)。这样,您不必每次都修改.bashrc文件(或像执行操作一样编辑PYTHONPATH)。

首先,从basrch文件中删除与ROS相关的命令,例如source/opt/ros/kinetic/setup.bash,并确保您现在可以在Python 3.x中import cv2且没有错误。

然后,创建环境并在此处安装所有与ROS相关的软件包。这样,我们将必须在运行ROS时激活此ros_environment。有关创建环境,请参见  https://conda.io/docs/user-guide/tasks/manage-environments.html#creating-an-environment-with-commands

接下来,激活您新创建的环境并遵循 https://conda.io/docs/user-guide/tasks/manage-environments.html#macos-and-linux 在建议的路径中创建文件。即

  

cd $ CONDA_PREFIX
  mkdir -p ./etc/conda/activate.d
  mkdir -p ./etc/conda/deactivate.d
  触摸./etc/conda/activate.d/env_vars.sh
  触摸./etc/conda/deactivate.d/env_vars.sh

按如下所示编辑./etc/conda/activate.d/env_vars.sh

    source/opt/ros/kinetic/setup.bash

还要在文件中添加任何其他与ROS相关的bash。

对于./etc/conda/deactivate.d/env_vars.sh,我要做的是将PYTHONPATH导出回Python3。例如,它可能是

    export PYTHONPATH="/usr/lib/python3/dist-packages"

请注意,这实际上并没有取消激活source/opt/ros/kinetic/setup.bash命令。我只是发现这样做可以将我的PYTHONPATH重定向回默认的python 3,并且即使在激活和停用ROS环境之后也可以找到正确的cv路径。

答案 2 :(得分:0)

在将cv2导入python代码之前,可以添加以下两行。它对我有效,无需更改任何源文件:

import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

然后导入cv2:

import cv2