67

我安装了 2 个版本的 python,但cmake使用的是旧版本。如何强制cmake使用较新的版本?

4

5 回答 5

46

您可以根据需要尝试以下任何一种:

为了CMake >= 3.12

根据变更日志:

添加了新的“FindPython3”和“FindPython2”模块,以及新的
“FindPython”模块,以提供一种定位
Python 环境的新方法。

find_package(Python COMPONENTS Interpreter Development)

文档

这个模块看起来更适合 Python 版本 3。如果未找到,则搜索版本 2。要管理 Python 的并发版本 3 和 2,请使用 FindPython3 和 FindPython2 模块而不是这个模块。

为了CMake < 3.12

文档

find_package(PythonInterp 2.7 REQUIRED)
find_package(PythonLibs 2.7 REQUIRED)
于 2016-01-03T20:01:02.340 回答
39

尝试添加-DPYTHON_EXECUTABLE:FILEPATH=/path/to/python2.7 可能是路径问题?

也可以指定你的 python 库的路径,使用你想要的版本:

 cmake -DPYTHON_LIBRARIES=/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib .
于 2013-03-08T10:20:01.437 回答
32

我有一个类似的问题,并使用保罗的回答作为提示解决了它。我需要使用python2.7来编译一个较旧的库,但cmake不断拿起我的python3.2库(和可执行文件)。

首先,我cmake使用默认选项运行,然后编辑CMakeCache.txt它生成的文件。我这样做主要是因为我首先不知道正确的-D...咒语来cmake获取 python 库和包含路径等。

在我的CmakeCache.txt中,我发现了这样的行

  • 程序路径

    PYTHON_EXECUTABLE:FILEPATH=/usr/bin/python
    
  • 目录的路径

    PYTHON_INCLUDE_DIR:PATH=/usr/include/python3.2
    
  • 图书馆的路径

    PYTHON_LIBRARY:FILEPATH=/usr/lib/libpython3.2.so
    

并用 替换每一次python3.2出现python2.7。我还必须重命名PYTHON_EXECUTABLEto use python2.7,因为它是我系统上python的符号链接。python3.2

然后我又跑了cmake。因为它更喜欢它的缓存值而不是实际查找库,所以这应该适用于所有情况。至少,它在我的身上发生了。

于 2013-04-16T19:55:52.943 回答
10

我使用 anaconda(python 2.7.8) 以及 python 2.7.6。

我试过-DPYTHON_EXECUTABLE:FILEPATH=$ANACONDA_HOME/bin了,但找到了 1.4 版(奇怪:)。

我的解决方案是将其更改为 PYTHON_EXECUTABLE:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TIFF=ON \
-DPYTHON_LIBRARY=$ANACONDA_HOME/lib/libpython2.7.so \
-DPYTHON_INCLUDE_DIR=$ANACONDA_HOME/include/python2.7/ \
-DPYTHON_EXECUTABLE=$ANACONDA_HOME/bin/python
于 2016-04-06T01:07:52.107 回答
1

我的用例是一个相当大的项目,其中 C++ 类通过Boost.Python. 在与 CMake 的 Python 解释器和库检测的各种怪癖作斗争之后,我终于放弃了自己的想法。我的方法基于稍微经过编辑的python-config脚本版本,有时(但不总是!)将其放入新创建的虚拟环境中(有关这些问题,请参阅此 SO 帖子pyvenv,但我离题了)。该脚本由一个小的 CMake 片段调用pyconfig.cmake。两者都可以从 GitHub repo cmake-python-config免费获得。

警告:脚本假定您的PATH. 未尝试检测 Python 2。这些脚本也不会尝试查找所有已安装的 Python3 版本。

于 2018-04-13T12:12:47.353 回答