当前位置: 首页 > news >正文

QT(6.5) cmake构建C++编程,调用python

一、注意事项

  1. explicit
    c++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色,构造器、类型转换操作符,
    c++提供关键字explicit,阻止转换构造函数进行的隐式转换的发生,声明explicit的构造函数不能在隐式转换中使用。
  2. c++ 函数前面和后面 使用const 的作用
    前面使用const 表示返回值为const;
    后面加 const表示函数不可以修改class的成员;
    const成员函数可以被非const对象和const对象调用;
    非const成员函数只能被非const对象调用;
  3. 类外补充函数的定义要加作用域限定符::

二、重要知识:cmake
在QT中选择cmake方式构建c++项目,最好提前了解cmake相关知识,以方便理解如何导入外部库,推荐学习视频链接:B站:爱编程的大丙
重要细节:静态库的链接要放在add_executable之前

三、c++代码调用python步骤

  1. 设置python配置
    CMakeList.txt文件中输入python文件的相关信息:头文件夹路径、库文件夹路径、需要连接的库文件名称(有没有.lib后缀都可)
include_directories(C:/programming/anaconda3/envs/pytorch/include)
link_directories(C:/programming/anaconda3/envs/pytorch/libs)
link_libraries(python3)
link_libraries(python38)

在这里插入图片描述
2. c++代码(.cpp)中调用python前初始化

#include <Python.h>Py_SetPythonHome(L"python.exe所在文件夹路径,即python安装路径");
//调用前必须初始化python解释器
Py_Initialize();
if(!Py_IsInitialized()){qDebug()<<"初始化失败";return 0;}
// 执行 python 语句
// 导入sys模块设置模块地址,以及python脚本路径
PyRun_SimpleString("import os");
PyRun_SimpleString("print('你好')");
// 加载 python 脚本
PyObject *pModule = PyImport_ImportModule("pythonFileName");
if (pModule == NULL) {// 模块导入失败,处理错误qDebug() << "脚本加载失败";} else {qDebug() << "脚本加载成功";// 创建函数指针PyObject* pFunc = PyObject_GetAttrString(pModule, "functionName");  // 方法名称if (pFunc == NULL) {// 函数导入失败,处理错误qDebug() << "函数创建失败";}else {qDebug() << "函数创建成功";// 调用无参函数PyObject *result  = PyObject_CallObject(pFunc, NULL);  // 或者调用有参函数// 创建函数参数PyObject* args = Py_BuildValue("(i,s)", 110, "hello");  // 参数为整数 110 和字符串 "hello"// s 将C字符串转换成Python对象,如果C字符串为空,返回NONE // z: 类似于 s,但允许转换为 NULL(Python 的 None)// c 将C类型的char转换成长度为1的Python字符串对象 // b: C unsigned char,将布尔值转换为 0 或 1// i 将一个C类型的int转换成Python int对象 // k: C unsigned long,转换为无符号长整数// l 将C类型的long转换成Pyhon中的int对象 // f 将C类型的float转换成python中的浮点型对象 // d 将C类型的double转换成python中的浮点型对象 // O 通用对象引用,接收任意 Python 对象而不转换// O!: 类型对象和转换标志,用于接收特定类型的 Python 对象// O&: 自定义回调函数,用于自定义对象转换// (ii):两个 C 整型变量构成的元组或列表// [ii]:两个 C 整型变量构成的列表 // {ss}:键值对都是 C 字符串的字典// #:s, #i, #d 等:带有长度指示的字符串、整数或浮点数// n: 接收 None,检查参数是否为 NonePyObject *result  = PyObject_CallObject(pFunc, args);  // 检查并处理有参函数调用的返回结果if (result  == NULL) {// 处理错误qDebug() << "函数调用失败";} else {// 使用返回值const char *result_str;if (!PyArg_Parse(result, "s", &result_str)) {// 错误处理:无法将Python对象转换为字符串} else {// 使用result_str}// 释放引用计数Py_DECREF(result);}// 释放参数元组Py_DECREF(args);// 释放函数指针Py_DECREF(pFunc);// 不再需要模块时,减少引用计数Py_DECREF(pModule);}
}
// 释放python所用内存
Py_Finalize();

未完待续

http://www.lryc.cn/news/322468.html

相关文章:

  • Java开发从入门到精通(九):Java的面向对象OOP:成员变量、成员方法、类变量、类方法、代码块、单例设计模式
  • 通过 Socket 手动实现 HTTP 协议
  • 探索数据结构:双向链表的灵活优势
  • 记录一次服务器内存使用率过高达到90%告警问题排查。
  • 基于react native的自定义轮播图
  • Jetson入坑记实
  • 算法系列--递归
  • 【JS】替换文本为emjio表情
  • Solr完结版
  • 外包干了5天,技术退步明显。。。。
  • Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展
  • 基于SpringBoot的高校办公室行政事务管理系统
  • Linux系统及操作 (04)
  • 粒子群算法 - 目标函数最优解计算
  • 关于MySQL数据库的学习3
  • 笔试题——得物春招实习
  • 动手做简易版俄罗斯方块
  • 【极简无废话】open3d可视化torch、numpy点云
  • C语言经典算法-6
  • 【计算机考研】杭电 vs 浙工大 怎么选?
  • 激活函数
  • 使用Jackson进行 JSON 序列化和反序列化
  • Linux/Uinx 系统编程:定时器以及时钟同步
  • (Ubuntu中调用相机花屏)Astra plus深度相机--rgb彩色图像花屏解决方法之一
  • iPaaS平台能帮助企业解决什么问题?
  • 数学建模(灰色关联度 python代码 案例)
  • 【DP】第十四届蓝桥杯省赛C++ B组《接龙数列》(C++)
  • 文件包含漏洞(input、filter、zip)
  • 使用iconv解决Linux/Ubuntu/Debian中gb2312中文文档乱码问题
  • 图论中的最小生成树:Kruskal与Prim算法深入解析