1 前言
最近项目中需要调用别人写的python程序,所以在网上找了一些QT调用python的资料,个人感觉挺简单的吧,自己写了一个Demo测试了一下。
2 python环境部署
python下载地址:https://www.python.org/downloads/
可以下载自己需要的版本,但是在下载的时候需要注意是32位还是64位,要看你使用的QT是32位还是64位的,
然后在安装的时候注意勾选 添加到环境变量选项,如果没有勾选则需要手动添加环境变量
3 编写python程序
可以使用notepad++编写一个简单的python程序,将python文件命名为“helloword.py"
def hellowordFunc():
print("helloword")
4 修改python与qt的冲突问题
从网上找了资料,我就直接修改这个地方了,修改python安装目录里的“/include/object.h"文件,用找到“PyType_Spec”
然后修改如下:
#undef slots
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
#define slots Q_SLOTS
5 QT调用
1)创建一个QT工程
详细步骤不解释了,会QT的都明白
2)配置python环境
在.pro文件中添加python的include目录以及,lib目录,如下
INCLUDEPATH += -I D:\Python36-32\include
LIBS += -LD:\Python36-32\libs -lpython36
3)在cpp文件中包含头文件
#include <Python.h>
4)在cpp中添加代码
//进行初始化
Py_Initialize();
//如果初始化失败,返回
if(!Py_IsInitialized())
{
qDebug() << "IsInitialized: error";
}
//导入.py文件
PyObject *pModule = PyImport_ImportModule("helloword");
if(!pModule)
{
qDebug() << "ImportModule: error";
}
//hellowordFunc
PyObject * pFuncHello = PyObject_GetAttrString(pModule, "hellowordFunc");
//如果失败则返回
if(!pFuncHello)
{
qDebug() << "GetAttrString: error";
}
//调用函数
PyObject_CallFunction(pFuncHello, NULL);
//退出
Py_Finalize();
执行带参数方法
PyObject * pFuncFile = PyObject_GetAttrString(pModule, "newFile");
if(!pFuncFile)
{
qDebug() << "GetAttrString: error";
}
PyObject *args2 = PyTuple_New(1);
PyTuple_SetItem(args2, 0, PyUnicode_FromString("d:/test_py.txt"));
PyObject_CallObject(pFuncFile, args2);
5)解决无法加载“python36_d.lib"的问题
直接找到“D:\Python36-32\libs”中的“python36.lib"文件,复制一份并重命名为“python36_d.lib"
6 结束语
好了,到这里就完成了调用python程序的全过程,千万要注意python的32位与64位要与QT的32位和64位适配,并且要添加python相关环境变量。