在QT C++中调用 Python并将软件打包发布(裸机可运行)
为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件。最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中调用自己写好的python函数完成相应的功能。由于这是第一次使用python 也是第一次将python嵌入QT中使用所以心中有以下几个疑虑:
1.Python是如何操作word文档的
2.QT中如何使用Python函数
3.按照QT程序的发布流程发布,是否会不兼容Python 使得软件无法运行
对于如何使用python和如何在QT中调用pthon网上已经有许多写的很好的文章了,这里会放上我学习参考的文章链接。本篇随笔主要记录,探讨在QT中调用python语言后的软件发布。
一.Python如何操作word文档
Python操作word文档我使用了docx模块
教你怎么使用Python对word文档进行操作 :
https://blog.csdn.net/wcg541/article/details/100999756
基本知道怎么使用docx模块之后个人感觉参考官方文档会更适合自身的开发。
Python docx:
https://python-docx.readthedocs.io/en/latest/
二.QT中如何调用Python函数
QT中使用C++调用python:
https://www.cnblogs.com/shenghl/p/4442528.html
常见问题:
https://blog.csdn.net/herr_kun/article/details/84570258
三.QT调用Python后如何发布程序
按照上面的两个文章代码的主要功能都实现的差不多了,这时候心里开始担心这次QT C++程序内调用了另外的一种语言,使用QT的windeployqt.exe发布程序只包含了QT所需要的环境对于Python的环境并没有打包,这样会导致在没有安装Python的电脑上无法运行。把网上的文章基本都看过一次之后还是没能解决,最终结合了多篇文章的做法自己又摸索了几天终于解决了在裸机上无法运行的问题。下面先讲讲发布的流程:
1.制作python环境文件夹
1.本次开发使用python3.7。首先新建一个文件夹,命名为 “Python37”。
2.打开python安装目录如下:
3.复制文件夹内的所有.dll文件,DLLs,include,Lib,libs 文件夹到第一步新建的Python37文件夹内,复制好后如下图:
4.将Python37文件夹复制到QT的release文件夹下(就是那个名字很长的文件夹)如下图:
2.在C++代码中使用 Py_SetPythonHome 函数指定python库 解释器的路径
Py_SetPythonHome((wchar_t *)(L"./Python37"));
Py_Initialize();
if ( !Py_IsInitialized() )
{
printf("Cant Py_IsInitialized !\n");
return ;
}
在调用python相关函数之前,先使用 Py_SetPythonHome((wchar_t *)(L"./Python37")) 指定好Python的库和解释器的位置。这里写的是在当前目录下的Python37文件夹(网上的文章用的是压缩包,我尝试使用压缩包出错,并且python37文件夹和python37压缩包放在一起还会导致python37文件夹找不到)。
如果没有将第一步制作的Python37文件夹放对位置或者Python37文件夹有问题编译会报错。
3.使用windeployqt.exe打包QT
这个操作在网上也是有很多文章这里就不具体讲了
https://blog.csdn.net/Zhenggenno_1/article/details/80459066
4.拷贝相关文件到发布好的QT文件夹中
在第3步中我生成了demo1.2文件夹,将我们第一步制作好的Python37文件夹,程序中使用到的.py文件以及Python37中的python3.dll python37.dll文件一起复制到demo1.2文件夹内。如下图,圈出的是需要复制到demo1.2中的文件:
至此,打包完成。
四.小结
1.使用Py_SetPythonHome 函数将python的库和解释器指定路径必不可少,之前按照网上很多方法都没有提及Py_SetPythonHome 函数的使用,如果在调试阶段Py_SetPythonHome 函数的传参可以设置为python的安装目录。
2.本次使用的打包方法(制作Python37文件)缺点在于文件夹较大,网上有说使用Pyinstaller和py2exe先发布python程序发布后会生成dis文件夹和base_library压缩包代替这里制作的Python37文件夹,但是我始终没成功。
3.PyImport_ImportModule突然报错时,检查下.py文件是否有问题(有可能修改后多了空格之类的导致.py文件编译不过)。
参考:
https://blog.csdn.net/spygg/article/details/104738799
https://blog.csdn.net/qq_34510308/article/details/83621237