为了提高工作效率,需要一个可以自动生成多份相关联的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并将软件打包发布(裸机可运行)的更多相关文章

  1. 在Qt(C++)中与Python混合编程

    一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...

  2. Win10 + CLion + 树莓派 + QT 远程开发调用Python

    原则:能在一个机器上开发的就不在两台机器上!! 首先需要配置远程QT开发环境 配置Cmake cmake_minimum_required(VERSION 3.14) project(qt_test) ...

  3. C#中调用python方法

    最近因为项目设计,有部分使用Python脚本,因此代码中需要调用python方法. 1.首先,在c#中调用python必须安装IronPython,在 http://ironpython.codepl ...

  4. C++中调用Python脚本

    C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库, 需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了 先看Python的代码 代 ...

  5. 如何在Java中调用Python代码

    有时候,我们会碰到这样的问题:与A同学合作写代码,A同学只会写Python,而不会Java, 而你只会写Java并不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方设法“调 ...

  6. 在Java中调用Python

    写在前面 在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢.当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单.恰好我在项目中就遇到了这个问题 ...

  7. 在Java中调用Python代码

    极少数时候,我们会碰到类似这样的问题:与A同学合作写代码, A同学只会写Python,不熟悉Java ,而你只会写Java不擅长Python,并且发现难以用Java来重写对方的代码,这时,就不得不想方 ...

  8. C++中调用Python脚本(转载)

    转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...

  9. Java程序中调用Python脚本的方法

    在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...

随机推荐

  1. ctfhub技能树—RCE—综合过滤练习

    打开靶机 查看页面信息 查看源码可以发现这一次过滤了很多东西,查看当前目录信息 查询到%0a为换行符,可以利用这个url编码进行命令注入,开始尝试 http://challenge-2a4584dab ...

  2. windows下如何安装Python、pandas

    windows下如何安装Python.pandas 本篇主要涵盖以下三部分内容: Python.Pycharm的安装 使用Pycharm创建.运行Python程序 安装pandas 1.Python. ...

  3. F4IF_INT_TABLE_VALUE_REQUEST选择屏幕自定义F4帮助

    今天在用 F4IF_INT_TABLE_VALUE_REQUEST函数写选择屏幕的自定义帮助的时候,发现了个问题,那就是 F4IF_INT_TABLE_VALUE_REQUEST中参数value_ta ...

  4. const关键字:终于拥有真正的常量声明语句

    本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...

  5. 入门OJ:photo

    题目描述 有N个人,来自K个家族.他们排成一行准备照相,但是由于天生的排外性,每个人都希望和本家族的人站在一起,中间不要加入别的家族的人.问最少从队列中去掉多少个就可以达到这个目的. 输入格式 第一行 ...

  6. C#+Layui开发后台管理系统

    ​我是笑林新记,分享一下我一套C#开发的后台管理系统,希望对大家有帮助!欢迎关注微信公众号:笑林新记   后台开发语言:C# 前端框架:layui   前天用毛笔笔画制作了一个毛笔字效果的Logo,主 ...

  7. 【2020CSP-S模拟赛day5】总结

    爆零自闭赛 写在前面 于2022.11.1 这一次题目质量很高(以至于什么都不会) 再一度体验了省选Orz.比赛大体情况,刨去std, wzc神仙230分,比剩下的加起来都高.zyz神仙60分. 其余 ...

  8. 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! 四.聚合分析 4.1 ...

  9. Mysql数据库下InnoDB数据引擎下的事务详解

    一.什么是数据库事务? 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开始与事务结束之 ...

  10. Bitter.Core系列七:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 示例 更新删除插入

    Bitter Orm 在操作数据库增删改的时候,支持模型驱动和直接执行裸SQL 操作,示例代码如下: 一:模型驱动(增删改) /// <summary> /// 插入,删除,更新示例(模型 ...