当我从主文件夹运行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-packages:$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上运行良好...
答案 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
之前。
我认为有两种方法:
python2.7/dist-packages
中删除PYTHONPATH
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