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 "My_Functions.h"
#include <QDir>
#include <Python.h>

My_Functions::My_Functions(QObject *parent) : QObject(parent){}
My_Functions:: ~My_Functions(){}

bool My_Functions :: directoryExisted(QString dirPath){
    QDir dir(dirPath);
    return dir.exists();
}

bool My_Functions :: fileExisted(QString filePath){
    QFile file(filePath);
    return file.exists();
}
bool My_Functions :: createDirectory(QString dirPath){
    QDir dir;
    return dir.mkpath(dirPath);
}
bool My_Functions :: invokePython(){
    QDir dir;
    const char* pythonFilePath = (dir.currentPath().append("/").append(dir.currentPath().split("/").last().split("-")[1])).toUtf8();
    Py_SetPythonHome(L"C:/programming/anaconda3/envs/pytorch");
    //调用前必须初始化python解释器
    Py_Initialize();
    if(!Py_IsInitialized()){qDebug()<<"初始化失败"; return 0;}

    // 将路径转换为Python对象
    PyObject *py_path_str = PyUnicode_FromWideChar(Py_DecodeLocale(pythonFilePath, NULL), -1);
    // 加载 python 脚本
    // 获取sys模块以进行项目.py文件的搜索
    PyObject *sys_module = PyImport_ImportModule("sys");

    // 获取sys.path
    PyObject *sys_path = PyObject_GetAttrString(sys_module, "path");
    if (!PyList_Check(sys_path)) {
        // sys.path不是列表,错误处理
        qDebug()<<"获取py搜索路径失败" ;

        // 释放python所用内存
        Py_Finalize();
        return 0;
    } else {
        // 将自定义路径添加到sys.path
        int appended = PyList_Append(sys_path, py_path_str);
        if (appended == -1) {
            // 错误处理
            qDebug()<<"添加py搜索路径失败" ;

            // 释放python所用内存
            Py_Finalize();
            return 0;
        }
    }


    PyObject *pModule = PyImport_ImportModule("onnxUse");
    if (pModule == NULL) {
        // 模块导入失败,处理错误
        qDebug() << "脚本加载失败";

        // 释放python所用内存
        Py_Finalize();
        return 0;
    } else {
        qDebug() << "脚本加载成功";
    }
    // 创建函数指针
    PyObject* pFunc = PyObject_GetAttrString(pModule, "detect_images");  // 方法名称
    if (pFunc == NULL) {
        // 函数导入失败,处理错误
        qDebug() << "函数创建失败";

        // 释放python所用内存
        Py_Finalize();
        return 0;
    }else {
        qDebug() << "函数创建成功";
    }

    // 调用有参函数
    // 创建函数参数
    // 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,检查参数是否为 None

    // PyObject* args = Py_BuildValue("(i,s)", 110, "hello");  // 参数为整数 110 和字符串 "hello"
    // PyObject *result  = PyObject_CallObject(pFunc, args);

    // 调用无参函数
    PyObject *result  = PyObject_CallObject(pFunc, NULL);

    // 检查并处理有参函数调用的返回结果
    if (result  == NULL) {
        // 处理错误
        qDebug() << "函数调用失败";

        // 释放python所用内存
        Py_Finalize();
        return 0;
    } else {
        // 使用返回值
        qDebug() << "函数调用成功";

        // const char *result_str;
        // if (!PyArg_Parse(result, "s", &result_str)) {
        //     // 错误处理:无法将Python对象转换为字符串
        //     qDebug() << "函数返回值处理失败";

        //     // 释放python所用内存
        //     Py_Finalize();
        //     return 0;
        // } else {
        //     // 使用result_str
        // }
    }

    // 释放引用计数
    Py_DECREF(result);
    // // 释放参数元组
    // Py_DECREF(args);
    // 释放函数指针
    Py_DECREF(pFunc);
    // 不再需要模块时,减少引用计数
    Py_DECREF(pModule);
    // 释放python所用内存
    Py_Finalize();
    qDebug()<<"调用完成";
    return false;
}

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/476843.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 + ts +element-plus + vue-router + scss + axios搭建项目

本地环境&#xff1a; node版本&#xff1a;20.10.0 目录 一、搭建环境 二、创建项目 三、修改页面 四、封装路由vue-router 五、element-plus 六、安装scss 七、封装axios 一、搭建环境 1、安装vue脚手架 npm i -g vue/cli 2、查看脚手架版本 vue -V3、切换路径到需…

DC-1靶场

一.环境搭建 下载地址 http://www.five86.com/downloads/DC-1.zip 把桥接设置为nat模式&#xff0c;打开靶机的时候会提示几个错误&#xff0c;点击重试即可 启动靶机&#xff0c;如下图所示即可 二.开始打靶 1.信息收集 arp-scan -l 扫描跟kali&#xff08;攻击机&…

李宏毅深度强化学习导论——基本概念

引言 这是李宏毅老师深度强化学习视频的学习笔记&#xff0c;主要介绍强化学习的基本概念&#xff0c;从直观的角度去教大家如何理解强化学习的知识而不是理论的角度&#xff0c;所以包含的数学公式不多。 什么是强化学习 我们知道监督学习需要人类给机器一个标签&#xff0c…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-21 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注…

3.windows下Ubuntu,sratoolkit软件,从ncbi的sra数据库下载数据。

NCBI的SRA&#xff08;Sequence Read Archive&#xff09;数据库是一个公共数据库&#xff0c;用于存储高通量测序数据&#xff0c;包括基因组、转录组和表观基因组等数据。研究人员可以在SRA数据库中找到各种生物样本的测序数据&#xff0c;并进行检索、下载和分析。 在NCBI的…

启扬RK3568核心板,助力外科手术机器人迈向智能诊疗之路

外科手术机器人是将机器人技术与外科手术相结合的高端医疗装备&#xff0c;可以帮助医生制定手术计划&#xff0c;提高手术过程中的准确度&#xff0c;并将传统技术转化为数字程序。通过利用机械控制、视觉成像、光电技术、人工智能等技术&#xff0c;外科手术机器人在医疗领域…

全国产飞腾+FPGA架构,支持B码+12网口+多串电力通讯管理机解决方案

行业痛点: 中国的电力网络已经成为当今世界覆盖范围最广、结构最为复杂的人造科技系统。随着国家和各部委颁布了一系列法律法规&#xff0c;如国家颁布的《中华人民共和国网络安全法》、工信部颁布的《工业控制系统信息安全防护指南》、发改委颁布的14号令《电力监控系统安全防…

动态规划课堂7-----两个数组的dp问题(等价代换)

目录 引言&#xff1a; 例题1&#xff1a;最长公共子序列 例题2&#xff1a;不同的子序列 例题3&#xff1a;通配符匹配 例题4&#xff1a;正则表达式 结语&#xff1a; 引言&#xff1a; 本节我们就要进入两个数组的dp问题的学习&#xff0c;通过前面几个章节的学习&…

深入剖析JavaScript引擎的工作原理

文章目录 导文什么是JavaScript引擎的工作原理&#xff1f;1. 解析阶段解析器&#xff08;Parser&#xff09; 2. 编译阶段3. 执行阶段解释器&#xff08;Interpreter&#xff09;优化器&#xff08;Optimizer&#xff09; 4. 垃圾回收阶段垃圾回收器 其他 导文 JavaScript引擎…

如何用SCSS制作小铃铛振动/震动/摇晃/晃动的特效/效果?

放大了看效果 ​​​​​​​​​​​​​​ // 摇晃小铃铛振动/震动/摇晃/晃动的特效/效果---------------------------------------- [sg-shaking] {display: inline-block;transform-origin: center top;animation: sg-shaking 1s alternate forwards; }keyframes sg-shaki…

【Apache ShenYu源码】如何实现负载均衡模块设计

ShenYu是一个异步的&#xff0c;高性能的&#xff0c;跨语言的&#xff0c;响应式的 API 网关。有关ShenYu的介绍可以戳这。 一、前瞻 今天我们尝试不同的代码阅读方式&#xff0c;按模块来去阅读源码&#xff0c;看看效果如何。 本次阅读锁定在shenyu-loadbalancer&#xf…

Java安全 反序列化(3) CC1链-TransformedMap版

Java安全 反序列化(3) CC1链-TransformedMap版 本文尝试从CC1的挖掘思路出发&#xff0c;理解CC1的实现原理 文章目录 Java安全 反序列化(3) CC1链-TransformedMap版配置jdk版本和源代码配置前记 为什么可以利用一.CC链中的命令执行我们可以尝试一下通过InvokerTransformer.tr…

Windows环境下编译ffmpeg 6.1源码--Virtual Studio + Msys2方式

环境准备 约定&#xff1a;源码全部放到sources下&#xff0c;目录结构说明 /d/java/ffmpeg #工程工目录 ├── build #存放编译文件的目录&#xff0c;子目录为具体模块的构建目录 │ ├── fdk-aac │ ├── ffmpeg │ └── x264 ├── instal…

O2OA(翱途)开发平台前端安全配置建议(一)

O2OA开发平台是一个集成了多种功能的开发环境&#xff0c;前端安全在其中显得尤为重要。前端是用户与平台交互的直接界面&#xff0c;任何安全漏洞都可能被恶意用户利用&#xff0c;导致用户数据泄露、非法操作或系统被攻击。因此&#xff0c;前端安全是确保整个系统安全的第一…

B011-springcloud alibaba rpc通信 Dubbo

目录 介绍实现提供统一业务api服务提供者1.导入依赖2添加dubbo配置3编写并暴露服务 服务消费者1.导入依赖2添加dubbo配置3引用服务 测试 介绍 Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC分布式服务框架&#xff0c;致力于提供高性能和透明化的 RPC远程服务调用方案&#xf…

数学建模(Topsis python代码 案例)

目录 介绍&#xff1a; 模板&#xff1a; 案例&#xff1a; 极小型指标转化为极大型&#xff08;正向化&#xff09;&#xff1a; 中间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 区间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 标…

【图像分类】基于深度学习的人脸表情识别(8种表情,ResNet网络)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的兄弟们可以私信…

“洞见·智领未来——2024行业开局暨成渝(内江)服务外包产业发展大会”共商服务外包新未来新业态

3月19日-20日&#xff0c;由中国信息协会、中共内江市委、内江市人民政府指导&#xff0c;中国信息协会数字经济专委会、中共内江市东兴区委、内江市东兴区人民政府共同主办&#xff0c;鸿联九五集团、首席客户官百人会&#xff08;CCO100&#xff09;承办的“洞见 智领未来—…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

opencv各个模块介绍(1)

Core 模块&#xff1a;核心模块&#xff0c;提供了基本的数据结构和功能。 常用的核心函数&#xff1a; cv::Mat&#xff1a;表示多维数组的数据结构&#xff0c;是OpenCV中最常用的类之一&#xff0c;用于存储图像数据和进行矩阵运算。 cv::Scalar&#xff1a;用于表示多通道…