为了提高工作效率,需要一个可以自动生成多份相关联的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. MyBatis初级实战之五:一对一关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. 运行.bat执行sql文件 —— mysql

    参考地址:https://www.cnblogs.com/dingjiaoyang/p/9990188.html 运行test.bat 执行 test.sql文件 test.bat: @ECHO OF ...

  3. JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  4. 词嵌入之GloVe

    什么是GloVe GloVe(Global Vectors for Word Representation)是一个基于全局词频统计(count-based & overall statisti ...

  5. luogu P4116 Qtree3

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  6. [Usaco2002 Feb]Rebuilding Roads重建道路

    题目描述 一场可怕的地震后,奶牛用N个牲口棚(1 <= N <= 150,编号1..N)重建了农民John的牧场.奶牛没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是唯一 ...

  7. C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    Twain 随着扫描仪.数码相机和其他图像采集设备的引入,用户热切地发现了将图像整合到他们的文档和其他工作中的价值.然而,支持这种光栅数据的显示和操作成本很高,应用程序开发人员需要创建用户界面并内置设 ...

  8. BBR implements bbr-like limiter 限流

    pkg/ratelimit/bbr/bbr.go:68 github.com/go-kratos // BBR implements bbr-like limiter.// It is inspire ...

  9. vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件

    基于Vue3.0构建PC桌面端自定义美化滚动条组件V3Scroll. 前段时间有分享一个Vue3 PC网页端弹窗组件,今天带来最新开发的Vue3.0版虚拟滚动条组件. V3Scroll 使用vue3. ...

  10. 使用Spring StateMachine框架实现状态机

    spring statemachine刚出来不久,但是对于一些企业的大型应用的使用还是十分有借鉴意义的. 最近使用了下这个,感觉还是挺好的. 下面举个例子来说下吧: 创建一个Spring Boot的基 ...