- Qt 自带编辑器 调用Python
- 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-



