C++ 调用 Python 代码 - Clion QT混合编程 ,各取长处。
Qt 自带编辑器 调用Python
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_SLOTSint main(int argc, char *argv[])
{QApplication a(argc, argv);Py_Initialize(); //初始化python模块PyRun_SimpleString("import sys");// 执行python importPyRun_SimpleString("sys.path.append('./')");// 添加python 查找路径if ( !Py_IsInitialized() ){return -1;// 如果初始化失败退出}PyObject *pModule = PyImport_ImportModule("main");//这里是要调用的文件名main.pyPyObject *func = PyObject_GetAttrString(pModule, "arg1");// main.py 中的方法名 arg1PyObject *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__初始化函数需要两个构造参数 所以写2PyTuple_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_SLOTSint main(int argc, char *argv[]) {system("chcp 65001"); //解决控制台中文乱码Py_Initialize();//初始化python模块PyRun_SimpleString("import sys");// python importPyRun_SimpleString("sys.path.append('./')"); // 添加python 查找路径if (!Py_IsInitialized()) {return -1;//初始化失败返回}PyObject *pModule = PyImport_ImportModule("main");//这里是要调用的文件名.pyPyObject *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-
C++ 调用 Python 代码 - Clion QT混合编程 ,各取长处。相关推荐
- Qt Creator与Qt+VS2015调用Python代码的实现
下面来介绍分别用Qt Creator与Qt+VS2015调用Python代码,首先电脑中要安装Python IDE与Qt.我电脑中安装的是Python37,VS2015+Qt5.8.Qt Creato ...
- python和C语言混合编程实例
转载自:http://www.jb51.net/article/50633.htm 这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可 ...
- c调用python脚本如何获取结果_使用C++调用Python代码的方法详解
一.配置python环境问题 1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中 安装之后的文件夹如下所示: 2.在VS中配置环境和库 右击项目->属性-&g ...
- java调用python代码
同样的我们需要安装jython,具体的步骤如下: 1. 去 http://sourceforge.net/projects/jython/ 下载最新的jython相关的jar包. 2. 下载下来的ja ...
- java代码调用python_java调用python代码-阿里云开发者社区
同样的我们需要安装jython,具体的步骤如下: 2. 下载下来的jar包其实既是使用的时候需要引入的jar包,也是安装就jython的jar包.具体安装细节参照:https://wiki.pytho ...
- JavaScript调用Python代码
JavaScript 可以使用 Node.js 的 child_process 模块来调用 Python 代码. 例如,你可以使用 child_process.spawn 方法来调用 Python 脚 ...
- xlwings : 从此可以 VBA 调用 Python 代码啦
Python 的库总是异常丰富,比如 Python 操作 Excel ,根据 详解Python操作Excel文件 这篇文章的介绍,竟然达到了 9 种之多,文章的列举还不一定是穷举式的.这么多库,也没必 ...
- 如何在Clion中使用C++调用Python代码
在很多时候,我们需要在一个c++工程项目中调用部分Python代码,这就需要我们实现Python和C++之间的交互.交互方式有两种:1. 依靠 TCP 建立的网络通信交互:2. 嵌入式混合语言编程(E ...
- 《Python开发 - Python杂记》Python与C/C++混合编程
Python是脚本语言,可以做的事情非常的多,本文将要讲解使用Python来调用C/C+库. 关于C/C++库的创建请看笔者以前的文章,这里只给出Window下的创建过程. 静态库和动态库(Windo ...
最新文章
- 【简便解法】1084 外观数列 (20分)_24行代码AC
- 测试Maven版本插件自动递增版本号
- 程序员专属精品简历合集—面试必备
- php求平均值的函数_剔除两侧极值求平均Excel公式 去掉最大值最小值
- mysql 5.7.14-winx64_mysql-5.7.14-winx64 解压版本安装
- 程序员面试金典——2.7回文链表
- jeval 公式_几款公式解析工具的比较
- «构建并破坏它»:某些算法如何生成验证码,而另一些则如何破解
- 使用阿里字体彩色图标
- 给移动硬盘装上LINUX全攻略,给移动硬盘装上LINUX全攻略
- 大学英语精读第二版(第五册)复习笔记——文章内容摘要
- 纯HTML+CSS实现3D炫酷魔方(相册)
- Unity5权威讲解 笔记
- RLS,LMS以及NLMS三种自适应均衡matlab仿真
- BlackArch---让你有电影中黑客的感觉
- android 连续播放动画,华为充电动画循环播放
- 黑龙江科技大学计算机分数,2017黑龙江科技大学录取分数线
- 如何用xp系统做服务器,xp系统如何做远程服务器呢
- 镜像法的理解——工程电磁场 P9
- 【5G RRC】RSRP、RSRQ以及SINR含义、计算过程详细介绍