1、python库的安装
方法有很多,我这里使用的最直接的方法直接去Python官网下载安装包,具体下载流程建议跟着下面文章做,篇幅过长。在qt调用中Py_SetPythonHome(L"E:/Python/Python3.xx.1");在3.11被禁用了,用更新版本可以用下面方法设置系统变量
然后不用Py_SetPythonHome()也可以。
2、添加下好的的python到qt中
首先需要将Python包含到库中,但是又会出现一些问题。其中我就遇到了其一,在qt中几乎一定会遇到。
因为是因为在Python和Qt中都定义了slots,如果一个类继承自QObject,这时再引入<Python.h>时,两者之间就会有冲突。在编译时会出现如下的错误:
解决方法
#pragma push_macro("slots")
#undef slots
#include <Python.h>
#pragma pop_macro("slots")
以下是调用实例:
Py_Initialize();
PyObject *pModule, *pFunc;
// 加载Python模块
pModule = PyImport_ImportModule("example");
if (pModule == nullptr)
{
qDebug() << "Failed to load Python module";
return;
}
// 获取Python函数
pFunc = PyObject_GetAttrString(pModule, "example_function");
if (pFunc && PyCallable_Check(pFunc))
{
// 调用Python函数
PyObject_CallObject(pFunc, nullptr);
}
else
{
qDebug() << "Failed to get Python function";
}
// 释放资源
Py_DECREF(pFunc);
Py_DECREF(pModule);
问题可以参Python C接口函数说明
重复调用的时候我遇到了Py_Finalize();调用后Py_Initialize();func无法再初始化,最后在析构函数调用Py_Finalize();一次即可,不需要多次掉用Py_Finalize();