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:\Users\wu\AppData\Local\Programs\Python\Python310\include  #python  include 路径

LIBS += -LC:\Users\wu\AppData\Local\Programs\Python\Python310\libs -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 <QtDebug>

#include <QApplication>


#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()<<returnStr;



    PyObject *pyClass = PyObject_GetAttrString(pModule, "CP");//main.py 中的类名
    PyObject *pConstruct = PyInstanceMethod_New(pyClass);// 创建对象
    PyObject* pParams = PyTuple_New(2);// 对象的__init__初始化函数需要两个构造参数  所以写2
    PyTuple_SetItem(pParams, 0, Py_BuildValue("s", "hello"));// 这是第一个参数
    PyTuple_SetItem(pParams, 1, Py_BuildValue("s", "world"));// 第二个参数
    PyObject* pIns = PyObject_CallObject(pConstruct,pParams);// 返回值

    PyObject* pFunhello= PyObject_GetAttrString(pIns,"hello");// 对象中方法
    PyObject* pParams1 = PyTuple_New(1);// 对象中方法参数个数
    PyTuple_SetItem(pParams1, 0, Py_BuildValue("s","world"));// 对象中方法参数
    PyObject *FuncTwoBack = PyObject_CallObject(pFunhello, pParams1);//获取返回值
    const char * Str = PyUnicode_AsUTF8(FuncTwoBack);
    qDebug()<<Str;

    MainWindow w;
    w.show();
    return a.exec();
}

看着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 <QApplication>
#include "Oeabt.h"
#include "image.h"
#include <QDebug>

#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-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值