栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 调用 Python 代码 - Clion QT混合编程 ,各取长处。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 调用 Python 代码 - Clion QT混合编程 ,各取长处。

  1. Qt 自带编辑器 调用Python 
  2. Clion 编辑器    调用Python

前言:python 无所不能。代码简洁,易于维护,开发效率很快。就是运行速度太慢。            C++速度快,但是开发繁琐,没有python简洁,能做的事也没有这么多,              两者联合,各取优点,这将看你如何调度,C++ 和 python。
QT自带的编辑器网上很多教程。这里只是简单介绍一下。主要介绍Clion.

1.Qt 自带编辑器 调用Python

不要把事情想得要复杂-不要把事情想得要复杂-不要把事情想得要复杂-

在QT工程目录下.pro中添加两个路径。

一个是python include 目录,一个是 python链接库,注意路径不要有特殊符号

INCLUDEPATH += C:UserswuAppDataLocalProgramsPythonPython310include  #python  include 路径

LIBS += -LC:UserswuAppDataLocalProgramsPythonPython310libs -lpython310  #python 链接库

找到python安装目录、

1,python include 目录。Python.h就在里面-C++会去里面找Python.h

不然 #include Python.h 的时候会报错、

2,python 链接库

 路径添加完整以后,就可以在C++ QT 中调用python 代码。

当然也有更简单,更不容易出错的方式:

 QT链接库的配置

如何使用:

建立一个main.py 文件放在 debug 文件夹中。和生成的exe 文件同级。

 在main.py文件中,创建一个函数。一个类。顺便提一嘴。python10 新增C++中的 switch 语句。功能非常强大,可以去试试哦。传送地址: python switch介绍

 言归正传

 问题来了。如何在C++中调用python 的方法和类呢?自己看。自己研究。

注意点:#include Python.h 的时候要添加上下两行代码。解决冲突、

#include "mainwindow.h"
#include 

#include 


#undef slots
#include "Python.h"
#define slots Q_SLOTS


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Py_Initialize();   //初始化python模块
    PyRun_SimpleString("import sys");// 执行python import
    PyRun_SimpleString("sys.path.append('./')");// 添加python 查找路径
    if ( !Py_IsInitialized() )
    {
    return -1;// 如果初始化失败退出
    }
    PyObject *pModule = PyImport_ImportModule("main");//这里是要调用的文件名main.py
    PyObject *func = PyObject_GetAttrString(pModule, "arg1");// main.py 中的方法名 arg1
    PyObject *args =  Py_BuildValue("ss", "hello", "world");// mian.py arg1方法需要两个参数。传给他
    PyObject *rets = PyObject_CallObject(func, args);// 返回值
    const char * returnStr = PyUnicode_AsUTF8(rets);
    qDebug()< 

看着QT 自带的编辑器。有什么感触。我反正觉得每天在看屎。

还是看看 Clion 编辑器 吧。

Clion 编辑器    调用Python

和QT一样。需要添加路径。在Clion CMakeLists.txt 中添加两行代码。

注意链接库路径要写全名。路径不可特殊字符

重点:路径必须在  add_executable的前面添加,

#python  include 路径
include_directories(C:/Users/wu/AppData/Local/Programs/Python/Python310/include)
#python 链接库
link_libraries(C:/Users/wu/AppData/Local/Programs/Python/Python310/libs/python310.lib)

 添加完以后,就可以使用python 了。对的就这么简单。

同样python .py文件放在 Debug 文件里,和exe 同级。

#include 
#include "Oeabt.h"
#include "image.h"
#include 

#undef slots

#include "Python.h"

#define slots Q_SLOTS

int main(int argc, char *argv[]) {
    system("chcp 65001"); //解决控制台中文乱码
    Py_Initialize();//初始化python模块
    PyRun_SimpleString("import sys");// python import
    PyRun_SimpleString("sys.path.append('./')"); // 添加python 查找路径
    if (!Py_IsInitialized()) {
        return -1;//初始化失败返回
    }
    PyObject *pModule = PyImport_ImportModule("main");//这里是要调用的文件名.py
    PyObject *func = PyObject_GetAttrString(pModule, "arg1"); // 方法
    PyObject *args = Py_BuildValue("ss", "hello", "world");// 方法参数

    PyObject *rets = PyObject_CallObject(func, args);  // 返回值
    const char *returnStr = PyUnicode_AsUTF8(rets);
    qDebug() << returnStr;

    PyObject *pyClass = PyObject_GetAttrString(pModule, "CP"); // 对象
    PyObject *pConstruct = PyInstanceMethod_New(pyClass);//创建对象
    PyObject *pParams = PyTuple_New(2);// 方法参数个数
    PyTuple_SetItem(pParams, 0, Py_BuildValue("s", "ArcWall.ngc"));//init第一个参数
    PyTuple_SetItem(pParams, 1, Py_BuildValue("s", "trackFile03.csv"));//init第二个参数
    PyObject *pIns = PyObject_CallObject(pConstruct, pParams);// 传入参数

    PyObject *pFunhello = PyObject_GetAttrString(pIns, "hello");//调用函数
    PyObject *pParams1 = PyTuple_New(1);//函数参数个数
    PyTuple_SetItem(pParams1, 0, Py_BuildValue("s", "ArcWall"));// 传参
    PyObject *FuncTwoBack = PyObject_CallObject(pFunhello, pParams1);//获取返回值
    const char *Str = PyUnicode_AsUTF8(FuncTwoBack);
    qDebug() << Str;

    QApplication a(argc, argv);
    auto oeabt = new Oeabt();
    oeabt->show();
    return QApplication::exec();
}

下期介绍python 调用C++ / C

end-

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号