CMakeLists设置

# 如果使用的是非系统目录下的 Python 可以通过指定 Python3_ROOT_DIR 改变查找路径
# set(Python3_ROOT_DIR "${CMAKE_SOURCE_DIR}/venv")
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
add_executable(cpp-python-test main.cpp)
target_include_directories(${PROJECT_NAME} PRIVATE ${Python3_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${Python3_LIBRARIES})

测试代码

// 在使用qt时,qt的slots与python的关键字冲突
#undef slots
#include <Python.h>
#define slots Q_SLOTS
​
class callPythonTest
{
public:
    static void callPy();
};
​
// callpythontest.cpp
void callPythonTest::callPy()
{
//    Py_SetProgramName(wcharArray[0]);  /* deprecated */
    Py_Initialize();
    PyRun_SimpleString("print(\"hello, world!\")");
    Py_Finalize();
}

FindPython3

找到 Python3 的解释器、编译器和开发环境(包括 include 的文件和库文件)

提供如下组件:

  • Interpreter:寻找 Python3 解释器

  • Compiler:寻找 Python3 编译器。仅使用 IronPython 时提供

  • Development:寻找开发环境套件(包含 include 目录和库文件)

  • NumPy:寻找 NumPy 的 include 目录

如果没有 COMPONENT 被指定,那么默认使用 Interpreter

为了确保所有组件 InterperterCompilerDevelopmentNumPy的版本一致,需要同时指定所有的组件,如下所示:

find_package(Python3 COMPONENTS Interpreter Development)

这个模块仅寻找 Python3 的版本。该模块可以和 FindPython2 同时使用,以便可以使用两个版本的 Python

同时如果 python 的版本对你并无大碍,可以使用 FindPython 模块

注意:如果 InterpreterDevelopment 组件都被指定的话,这个模块只会搜索 Cmake 配置的平台架构的解释器。如果仅指定了 Interpreter 组件的话,这个约束不会生效。

导入的目标

这个模块定义了如下几个导入目标(当 CMAKE_ROLE 为项目时)

名称

说明

Python3::Interpreter

Python3 解释器。如果找到 Interpreter 组件那么目标会被定义。

Python3::Compiler

Python3 编译器。如果找到 Compiler 组件那么目标有定义。

Python3::Python

Python3 嵌入库。如果找到 Development 组件那么目标有定义。

Python3::Module

Python3 模块。如果找到 Development 组件那么目标有定义。

Python3::NumPy

Python3 的 Numpy 组件。如果找到 NumPy 组件那么目标有定义。

结果变量

这个模块会在项目中定义下列的变量(可以查看标准变量命名)

名称

说明

Python3_Found

系统具有 Python3 需要的组件

Python3_Interpreter_Found

系统具有 Python3 解释器

Python3_EXECUTABLE

Python3 解释器的路径

Python3_INTERPRETER_ID

解释器名称的唯一标识,可能是 PythonActivePythonAnacondaCanopyIronPython之一

Python3_STDLIB

标准平台独立安装的目录。可以通过 distutils.sysconfig.get_python_lib(plat_specific=False, standard_lib=True) 获取信息

Python3_STDARCH

标准平台依赖安装的目录。可以通过 distutils.sysconfig.get_python_lib(plat_specific=True,standard_lib=True) 获取信息

Python3_SOABI

模块的扩展名后缀。可以通过 distutils.sysconfig.get_config_flag('SOABI')distutils.sysconfig.get_config_flag('EXT_SUFFIX')python3-config --extension-suffix 获取信息

Python3_Compiler_FOUND

系统具有 Python3 编译器

Python3_COMPILER

Python3 编译器的路径,只有使用 IronPython 时提供

Python3_COMPILER_ID

编译器名称的唯一标识,可能是 IronPython

Python3_Development_FOUND

系统具有 Python3 开发环境套件

Python3_INCLUDE_DIRS

Python3 include 文件目录

Python3_LIBRARIES

Python3 库文件

Python3_LIBRARY_DIRS

Python3 库文件路径

Python3_RUNTIME_LIBRARY_DIRS

Python3 运行时库文件路径

Python3_VERSION

Python3 版本

Python3_VERSION_MAJOR

Python3 主版本

Python3_VERSION_MINOR

Python3 此版本

Python3_VERSION_PATCH

Python3 小版本

Python3_NumPy_FOUND

系统具有 Numpy

Python3_NumPy_INCLUDE_DIRS

NumPy include 文件目录

Python3_NumPy_VERSION

NumPy 版本

提示

用户可以通过修改如下变量的属性更改使用的 Python3 的属性,例如安装位置等

名称

说明

Python3_ROOT_DIR

定义 Python3 安装的根目录路径