-
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 代码。
当然也有更简单,更不容易出错的方式:
如何使用:
建立一个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-