我的机器上安装了两个不同版本的python:2.4和2.7。我正在尝试为2.7版本安装OpenCV(2.4.5)。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D BUILD_EXAMPLES=ON ..
它将python 2.4检测为当前安装:
-- Python:
-- Interpreter: /usr/bin/python2.4 (ver 2.4)
-- Libraries: /usr/lib64/python2.4/config/libpython2.4.a
-- numpy: /usr/lib64/python2.4/site-packages/numpy/core/include (ver 1.2.1)
-- packages path: lib/python2.4/site-packages
以及后来构建opencv给了我这个错误:
[ 75%] Generating pyopencv_generated_funcs.h, pyopencv_generated_func_tab.h, pyopencv_generated_types.h, pyopencv_generated_type_reg.h, pyopencv_generated_const_reg.h
File "/home/mmoghimi/opencv-2.4.5/modules/python/src2/gen2.py", line 815
cname1=("cv::Algorithm" if classinfo.isalgorithm else classinfo.cname)))
^
SyntaxError: invalid syntax
make[2]: *** [modules/python/pyopencv_generated_funcs.h] Error 1
make[1]: *** [modules/python/CMakeFiles/opencv_python.dir/all] Error 2
make: *** [all] Error 2
显然它使用了python2.4不支持的新格式。所以,我的问题是有没有办法明确指定python的版本?
答案 0 :(得分:20)
有一些Cmake标志允许您明确指定要使用的Python版本。您需要将这些标志的值设置为安装Python的正确位置。
标志名称和可能的位置如下:
PYTHON_EXECUTABLE=/usr/bin/python2.7/
PYTHON_INCLUDE=/usr/include/python2.7/
PYTHON_LIBRARY=/usr/lib/libpython2.7.a //or .so for shared library
PYTHON_PACKAGES_PATH=/usr/local/lib/python2.7/site-packages/
PYTHON_NUMPY_INCLUDE_DIR=/usr/local/lib/python2.7/dist-packages/numpy/core/include
如果这些路径不起作用,您需要在计算机上找到它们。
答案 1 :(得分:2)
virtualenv -p python2.7 env
source env/bin/activate
python --version # prints «Python 2.7.3»
pip install pyopencv
如果您需要2.4(或其他版本)的支持,只需创建新环境。
答案 2 :(得分:0)
这是一个低质量的答案,但是如果您已经尝试了十个小时并且需要一些新的想法,它仍然非常有用。
这个问题花了我一天的时间,我仍然不确定如何解决它,但是这里有一些提示,以防仅给出的答案不能解决问题:
最初,我关注的是this guide,其总结如下:
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install build-essential git cmake pkg-config libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk2.0-dev libatlas-base-dev gfortran
git clone https://github.com/Itseez/opencv.git && cd opencv &&git checkout 3.0.0
sudo apt-get install python2.7-dev && sudo apt-get install python3-dev
cd ~ && wget https://bootstrap.pypa.io/get-pip.py && sudo python get-pip.py
pip3.6 install numpy # note that we specify the pip version after the command
# it is also possible to write python3.6 to refer to the python version 3.6 command
# The following failed for me. Use it if it works for you.
cd ~/opencv && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D INSTALL_PYTHON_EXAMPLES=ON
-D INSTALL_C_EXAMPLES=ON
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
-D BUILD_EXAMPLES=ON ..
# This must be done after cmake worked. Pay attention to the start of the cmake output. It tells you whether it found the Python Interpreter.
cd ~/opencv && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE
-D CMAKE_INSTALL_PREFIX=/usr/local
-D INSTALL_PYTHON_EXAMPLES=ON
-D INSTALL_C_EXAMPLES=ON
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
-D BUILD_EXAMPLES=ON ..
我已经安装了python 2.7和3.4,并在/usr/local/bin
中自己构建了python 3.6。在遵循Aurelius' Answer并进行了一些尝试之后,我构建了以下cmake命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D PYTHON_EXECUTABLE=/usr/local/bin/python3.6/ -D PYTHON_INCLUDE=/usr/local/include/python3.6m/ -D PYTHON_LIBRARY=/usr/local/lib/python3.6/ -D PYTHON_PACKAGES_PATH=/usr/local/lib/python3.6/site-packages/ -D PYTHON_NUMPY_INCLUDE_DIR=/usr/local/lib/python3.6/dist-packages/numpy/core/include/ -D PYTHON_INCLUDE_DIR=/usr/local/include/python3.6m/ -D PYTHON_LIBRARY=/usr/local/lib/ -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON3_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D PYTHON3_INCLUDE=/usr/local/include/python3.6m/ -D PYTHON3_LIBRARY=/usr/local/lib/python3.6/ -D PYTHON3_PACKAGES_PATH=/usr/local/lib/python3.6/site-packages/ -D PYTHON3_NUMPY_INCLUDE_DIR=/usr/local/lib/python3.6/dist-packages/numpy/core/include/ -D PYTHON3_INCLUDE_DIR=/usr/local/include/python3.6m/ -D PYTHON3_LIBRARY=/usr/local/lib/ ..
请注意,其中许多可能没有意义。我一直在漫不经心地尝试,直到有东西可以工作为止。 Some of these pathes can be found using python itself,例如
python3.6 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())"
或直接在cmake命令中:
$ cmake .. \
-DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
-DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
在这一点上,cmake正在寻找正确的python解释器和库...但是随后失败了,说它没有找到它们。我只能从内存中引用错误,因为我无法在tmux中向后滚动足够远的距离,并且我不想重现该错误。
opencv发现不合适的版本“ 1.4”,但要求至少为3.6
解决方案是telling cmake exactly what you want,方法是修改文件build/../cmake/OpenCVDetectPython.cmake
,使其在开头的某处包含以下检查:
find_package( PythonInterp 3.6 REQUIRED )
find_package( PythonLibs 3.6 REQUIRED )
(请注意,these are deprecated)
它仍然不起作用,那是因为我设置了cmake标志-D PYTHON3_EXECUTABLE
。 This e-mail chain有助于解决这一问题,并建议使用virtualenv作为替代解决方案。 我可能应该从哪开始。