error importing cv2 in python3.6 but it works for python2.7

asked 2020-08-08 11:25:30 -0500

PKGosal gravatar image

updated 2020-08-08 19:02:01 -0500

Error I get when using python3.6

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/local/lib/python3.6/dist-packages/ undefined symbol: PyCObject_Type

However, when I use python2.7, I get no errors

>>> import cv2
>>> cv2.__version__

I installed opencv 4.0.0 from source and ensured proper bindings to Python2.7 and Python3.6. Ensured that ..../dist-packages for both versions of python had file. See contents of dis-packages below.

$ls /usr/local/lib/python2.7/dist-packages
$ ls /usr/local/lib/python3.6/dist-packages                  pip-20.2.1.dist-info                              py
decorator-4.4.0.dist-info           py-1.8.0.dist-info                        __pycache__
future                              pykalman
future-0.17.1.dist-info             pykalman-0.9.5.dist-info
importlib_metadata                  stevedore
importlib_metadata-1.7.0.dist-info  stevedore-3.2.0.dist-info
libfuturize                         virtualenv-16.6.0.dist-info
libpasteurize                       virtualenv_clone-0.5.4.dist-info
networkx-2.3.dist-info              virtualenv_support
numpy                               virtualenvwrapper
numpy-1.19.1.dist-info              virtualenvwrapper-4.8.4.dist-info
numpy.libs                          virtualenvwrapper-4.8.4-nspkg.pth
past                                zipp-3.1.0.dist-info

SO, I see that file is there in both dist-packages... I am not sure why I am seeing the error for Python3.6. PS: The file was initially missing from dis-packages of python3.6 when I checked after successful completion of cmake and make... So, I manually copied the file from dist-packages of python2.7 and pasted it in dist-packages of oython3.6.. (I am not sure if this was the right thing to do!) SO, the file is essentially the same in both versions of python.

Below is how i built from source.

-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D PYTHON3_EXECUTABLE=$(which python3.6) \
-D PYTHON2_EXECUTABLE=$(which python2.7) \
-D PYTHON2_INCLUDE_DIR=$(python2.7 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON2_INCLUDE_DIR2=/usr/include/aarch64-linux-gnu/python2.7 \
-D PYTHON3_INCLUDE_DIR=$(python3.6 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-D PYTHON3_INCLUDE_DIR2=/usr/include/aarch64-linux-gnu/python3.6m \
-D PYTHON2_LIBRARY=/usr/lib/python2.7/config-aarch64-linux-gnu/ \
-D PYTHON3_LIBRARY=/usr/lib/python3.6/config-3.6m-aarch64-linux-gnu/ \
-D PYTHON2_NUMPY_INCLUDE_DIR=$(python2.7 -c "import numpy; print(numpy.get_include())") \
-D PYTHON3_NUMPY_INCLUDE_DIR=$(python3 -c "import numpy; print(numpy.get_include())") \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=ON \
-D HAVE_opencv_python2=ON \
-D HAVE_opencv_python3=ON \
-D PYTHON_DEFAULT_EXECUTABLE=$(which python2.7) \
-D \
-D BUILD_opencv_hdf=OFF \

This is part of the output on the console after cmake command.

-- General configuration for OpenCV 4.0.0 =====================================

-- Version control: unknown

-- Extra modules: -- Location (extra): /home/prabhjot/opencv_contrib/modules

-- Version control (extra): unknown

-- Platform: -- Timestamp: 2020-08-08T23:55:46Z -- Host: Linux 5.4.0-42-generic x86_64 -- CMake: 3.10.2 ... (more)

edit retag flag offensive close merge delete


I installed opencv 4.0.0 from source

unfortunately, that's far too old (probably noone will be able to reproduce your problems), we're at 4.4 currently

berak gravatar imageberak ( 2020-08-08 11:49:53 -0500 )edit

however, please add the cmake (console) output, maybe it has some info, why (or if) py3 was dropped

berak gravatar imageberak ( 2020-08-08 11:50:43 -0500 )edit

So, I manually copied the

no, you should run make install instead

berak gravatar imageberak ( 2020-08-08 11:51:46 -0500 )edit

@berak Thanks for the quick response. I did a clean re-install by running (sudo cmake uninstall) ffirst rom my build directory and confirmed that previous built files were all removed. I also removed files from dist-package/site-package... Deleted the built directory and did a clean Reinstall...... I used the same Cmake variables that I used before (shown above). I have added the output of Cmake to my original question above . I also did sudo make install after make -j7.. But I am getting the same results as before. Note that files were missing from site-packges and dist-packages for both python2.7 and python3.6 after all of this. But they were present in /usr.local/python/python2.7 and /usr/local/python/python3.6... So, I am still getting the same result as mentioned above

PKGosal gravatar imagePKGosal ( 2020-08-08 19:33:11 -0500 )edit

Is it possible that because I have -D PYTHON_DEFAULT_EXECUTABLE=$(which python2.7) \ in Cmake that may be leading to this end result? Note that because files were not present in site-packages/ dist-packages ... I manually added them for both python2 and python3. ANd the end result is that cv2 is successfully imported in python2 but not in python3.

PKGosal gravatar imagePKGosal ( 2020-08-08 19:34:51 -0500 )edit

Python 2 is obsoleted. But why you want that?

supra56 gravatar imagesupra56 ( 2020-08-09 20:52:25 -0500 )edit