首页 > 编程语言 >C++ CMake 使用 Python3

C++ CMake 使用 Python3

时间:2022-09-29 21:45:24浏览次数:77  
标签:Development CMake C++ 组件 Interpreter include NumPy Python3

C++ CMake 使用 Python3

CMakeListst 设置

# 如果使用的是非系统目录下的 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})

测试代码

#include <Python.h>

int main(int, char **)
{
    Py_Initialize();
    PyRun_SimpleString("print('Hello World')");
    Py_Finalize();
    return 0;
}

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 安装的根目录路径

参考文章

FindPython3
浅析 C++ 调用 Python 模块

标签:Development,CMake,C++,组件,Interpreter,include,NumPy,Python3
From: https://www.cnblogs.com/mxnote/p/16743186.html

相关文章

  • Python3安装psutil报错
    报错:pip3installpsutilcompilationterminated.error:command'gcc'failedwithexitstatus1解决:yuminstallpython3-devel继续安装:[root@centos......
  • C++ 调用python方法
    主流方法将python程序编程文本形式的动态链接库,在c/c++程序中调用其中定义的函数。本质上是在c++中启动了一个python解释器,由解释器对python相关的代码进行执行,执行......
  • 不是吧,MATLAB代码居然能直接转成C/C++代码
    前一段时间在工作中遇到这样一个实际问题,项目主体部分是用C++写的,但其中有一小部分算法是用MATLAB写的。于是乎,我第一想法是如何用C++把MATLAB中的代码实现出来。这时,一位前......
  • 百度工程师带你探秘C++内存管理(理论篇)
    作者|daydreamer在互联网的服务中,C++常用于搭建高性能、高并发、大流量、低延时的后端服务。如何合理的分配内存满足系统高性能需求是一个高频且重要的话题,而且因为内存自......
  • Python3
    实例一:importdatetime#定义一个列表mot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择。","今天星期二:\n含泪播种的人一定能笑着收获。","......
  • DEV C++创建64位DLL,再用C#调用入门测试
    1. DEVC++创建64位DLL  DEVC++新建--项目--dll--选择C项目---确定  C文件中添加1#include"devdll.h"2#include<windows.h>3/*在程序中添加......
  • 使用C++语言特性中支持面向对象的语法,实现一个Point类来描述点的基础属性和操作。
    1#include<iostream>2usingnamespacestd;3classPoint{4public:5Point(intx0=1,inty0=2);6Point(constPoint&p);7......
  • Python3 字典 items() 方法
    描述:Python字典items()方法以列表返回视图对象,是一个可遍历的key/value对。dict.keys()、dict.values()和dict.items()返回的都是视图对象(viewobjects),提供了字典实......
  • Python3 range() 函数用法
    Python3range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。Python3list()函数是对象迭代器,可以把range()返回的可迭代对象转为......
  • 【教程】VsCodeForCPP 最简单一键启动VsCode C/C++环境,无需任何配置
    整合VsCode以前的教程中,总有各种同学由于环境变量编译器的配置问题出现无法使用的情况,于是我将VsCode移植成绿色版本,直接整合C++编译器,全部配置为动态路径,保证即开即用......