为了提高工作效率,需要一个可以自动生成多份相关联的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. CF625E Frog Fights

    有\(n\)只青蛙在一个长度为\(m\)的环上打架:每只青蛙有一个初始位置\(p_i\),和一个跳跃数值\(a_i\).从\(1\)号青蛙开始按序号循环行动,每次若第\(i\)只青蛙行动,则它会向前跳 ...

  2. shell批量解压源码包

    有时候部署环境有很多安装包,如果一个一个地解压缩实在太麻烦了,可以用shell批量进行解压缩.命令如下: [root@localhost ~]# vi tar.sh #! /bin/bash #标称是 ...

  3. vue.esm.js?efeb:628 [Vue warn]: Invalid prop: type check failed for prop "defaultActive". Expected String with value "0", got Number with value 0.

    vue.esm.js?efeb:628 [Vue warn]: Invalid prop: type check failed for prop "defaultActive". ...

  4. Hugo 博客中文指南(基础教程)

    1. 安装 Hugo 从 Hugo 项目主页下载 Releases 文件,解压 hugo.exe 文件到 C:\Windows\System32 目录下. 2. 创建站点 hugo new site ...

  5. 活动精彩实录 | 王峰:Cassandra在360的多场景应用及未来趋势

    点击此处观看完整活动视频 大家好,我是360的王峰,我今天主要通过Cassandra在多场景下的应用来介绍一下Cassandra在360落地的情况. 我会从以下这几个方面进行介绍.首先介绍下Cassa ...

  6. P95、P99.9百分位数值——服务响应时间的重要衡量指标

    前段时间,在对系统进行改版后,经常会有用户投诉说页面响应较慢,我们看了看监控数据,发现从接口响应时间的平均值来看在500ms左右,也算符合要求,不至于像用户说的那么慢,岁很费解,后来观察其它的一些指标 ...

  7. 图文并茂-超详解 CS:APP: Lab3-Attack(附带栈帧分析)

    CS:APP:Lab3-ATTACK 0. 环境要求 关于环境已经在lab1里配置过了.lab1的连接如下 实验的下载地址如下 说明文档如下 http://csapp.cs.cmu.edu/3e/at ...

  8. 五:SpringBoot-多个拦截器配置和使用场景

    SpringBoot-多个拦截器配置和使用场景 1.拦截器简介 1.1 拦截器中应用 2.拦截器用法 2.1 编写两个拦截器 2.1.1 OneInterceptor 拦截器 2.1.2 TwoInt ...

  9. 26.Apache

    1.Apache简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性(尽管不断有 ...

  10. 【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动

    一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1dv411Y7x3 使用STM32 HAL库编程 PWM+DMA控制输出,CubeMX生成初始工程 实现 ...