在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
在QT C++中调用 Python并将软件打包发布(裸机可运行)的更多相关文章
- 在Qt(C++)中与Python混合编程
一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...
- Win10 + CLion + 树莓派 + QT 远程开发调用Python
原则:能在一个机器上开发的就不在两台机器上!! 首先需要配置远程QT开发环境 配置Cmake cmake_minimum_required(VERSION 3.14) project(qt_test) ...
- C#中调用python方法
最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...
- C++中调用Python脚本
C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...
- 如何在Java中调用Python代码
有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...
- 在Java中调用Python
写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...
- 在Java中调用Python代码
极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...
- C++中调用Python脚本(转载)
转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...
- Java程序中调用Python脚本的方法
在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...
随机推荐
- cursor pin s和cursor pin s wait on x
1.cursor pin s是一个共享锁,一般情况下是因为发生在SQL短时间内大量执行 案例:在生产库中,突然出现大量的cursor pin s的等待,询问是否有动作后,同事说有编译存储过程(被误导了 ...
- SAP里会话结束方法(杀死进程)
在SAP的ERP里,有很多方法可以结束一个会话,然而在不同情况下,需要使用的方法也不同.下面从先后顺序来简单说明:1.SM04:最常用的方法,在SM04点击工具栏的会话->结束会话,来关闭一个会 ...
- 宝塔的url计划任务
to通过url访问 就像访问你的网站一样 然后控制器/方法里面写你要做的操作 就可以了 ,简单的一批
- uni-app开发经验分享十五: uni-app 蓝牙打印功能
最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家. 引入tsc.js 简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单 ...
- .net code+vue 文件上传
后端技术 .net code 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnet ...
- U盘制作系统启动盘方法
1.下载一个UltralSO用来把CentOS系统镜像写入U盘作为启动安装盘 U盘用一个空U盘,会格式化的. 下载下来,使用试用版就行 刻录完成.
- Micro Frontends 微前端
Micro Frontends https://martinfowler.com/articles/micro-frontends.html Integration approaches Server ...
- Page (computer memory) Memory segmentation Page table 虚拟地址到物理地址的转换
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described ...
- java--Aop--记录日志
package com.pt.modules.log; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; imp ...
- Cisco的互联网络操作系统IOS和安全设备管理器SDM__管理Cisco互联网络
1.如果不能远程登录到一台设备上,可能是由于远程设备上没有设置口令.也可能是由于访问控制列表过滤了远程登录会话. show users:检查都有哪些设备连接到了此路由器. clear line #:清 ...