前言:在做项目的过程中,需要使用QT来调用Python3写的脚本文件,经过一番折腾终于搞定,现记录在此方便查询。
0、开发环境
win10_64、QT5.10.1 msvc2015_64、Python3.7
1、QT中添加python脚本
QT Creator是支持添加Python脚本的,可以在工程文件上新添文件中选择“python”。
2、pro文件设置
在完成此步骤前,需保证用户机器上安装好了Python对应版本,作者机器上安装的是Python3.7。然后参照下图配置文件,用户参考自己机器中Python安装位置进行设置。
3、调用格式
添加头文件 #include <Python.h> ,调用Python脚本中的函数方法可参考如下:
#include <Python.h>
void MainWindow::function()
{
//初始化Python解释器,这是调用操作的第一步
Py_Initialize();
if ( !Py_IsInitialized() )
{
return ;
}
//获取SVR.py模块的指针
PyObject* pModule = PyImport_ImportModule("SVR");
if (!pModule)
{
cout<< "Cannot open python file!\n" << endl;
qDebug()<<"cannot open python file";
return ;
}
//获取Pb_SVR函数的指针
PyObject* pFun= PyObject_GetAttrString(pModule,"Pb_SVR");
if(!pFun)
{
cout<<"Get function Pb_SVR failed"<<endl;
qDebug()<<"Get function Pb_SVR failed";
return ;
}
else
{
/* 用户代码 */
}
//销毁Python解释器,这是调用的最后一步
Py_Finalize();
}
用户在编写好自己的任务函数后,此时若去编译工程,会报error:error: expected unqualified-id before ';' token的错,原因是Python中object.h头文件中定义的slots与QT自身的slots冲突,为解决该问题需修改头文件。(ps:Python脚本文件应使用Release模式下编译)
4、Python中object.h头文件的修改
找到object.h文件第440行左右的结构体。按下图所示,增添如黄框所示的两行代码即可。
5、运行
编译通过后,需将.py文件拷贝到可执行文件.exe同目录下,若用户编写的python脚本中调用了第三方库,则需要同时将第三方库也拷贝到该目录下。Python第三方库文件在安装目录下的Lib文件下的site-packages文件夹下里,如作者的在D:\CodingSoft\Python3\Lib\site-packages 。(注意:作者在release文件夹中添加第三方库文件时遇到一个运行错误,当我将高版本的第三方库文件导入时,运行程序会崩溃;但是当我导入低版本库时,程序却运行正常,怀疑与Python脚本中使用的三方库版本有关)
6、打包
在作者使用的机器上完成了整个程序的编译工作且能正常运行,现需要将其安装发布在目标机上运行,现记录过程。
这里采用最简单的方法:由于Python3的离线安装包大小也才200MB左右,因此完全可以直接在目标机上安装一个同版本的Python,然后将需要用到的第三方库文件导出到打包路径下,最后使用网上推荐的QT自带的windeployqt.exe打包工具打包就行。