在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

(0)

相关推荐

  • pyhon笔记入门

    人生苦短,我用Python 博客园精华区01-15 23:46 (一)认识Python Python背景介绍 Python的格言: Life is short,use python. (人生苦短,我用 ...

  • 如何加密你的 Python 代码

    前言 本文将首先介绍下现有源码加密方案的思路.方法.优点与不足,进而介绍如何通过定制 Python 解释器来达到更好地加解密源码的目的. 现有加密方案 由于 Python 的动态特性和开源特点,导致 ...

  • 目标检测使用LabelImg标注VOC数据格式和YOLO数据格式——LabelImg使用详细教程

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 目标检测使用LabelImg标注VOC数据格式和YOLO数据格式--LabelImg使用详细教程 文章目录: 1 Lab ...

  • spyder使用教程

    spyder使用教程 现在anaconda自己集成了Spyder编辑器,不用我们安装Spyder,就可以用它来写Python代码. 上面2个打开任意一个红框皆可以,点击,打开Preference, 点 ...

  • python之路—模块和包

    阅读目录 一 模块 3.1 import 3.2 from ... import... 3.3 把模块当做脚本执行 3.4 模块搜索路径 3.5 编译python文件 二 包 2.2 import 2 ...

  • Python解释器种类有哪些?有什么特点?

    当我们编写完Python代码时,我们会得到一个包含Python代码的以.py为扩展名的文件,这个时候,我们要运行这个代码,就需要Python解释器去执行.py文件.那么Python解释器种类有哪些?具 ...

  • reticulate包 | 在Rmarkdown中调用Python代码

    Python和R是一对数据科学两大语言,在互联互通的路上,我感觉R更加的积极.还记得之前 Python中调用R的库-rpy2, 在Python使用R语言语法还是有些不自然.在R中调用Python体验十 ...

  • 'Python替代Excel Vba'系列(终):vba中调用Python

    系列文章 '替代Excel Vba'系列(一):用Python的pandas快速汇总 'Python替代Excel Vba'系列(二):pandas分组统计与操作Excel 'Python替代Exce ...

  • 如何在Excel中调用Python脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  • SPL 中调用 Python 程序

    集算器是强大的数据计算引擎,但目前对于机器学习算法的提供还不够丰富.而 python 中有许多此类算法.借助 YM 外部库,就可以让集算器 SPL 调用 python 写的代码,从而弥补这一不足.下面 ...

  • 如何在 Excel 中调用 Python 脚本,实现数据自动化处理

    这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5 ...

  • (1条消息) Android Studio在Gradle中调用cmd脚本

    Gradle中调用cmd 需要在Gradle编译时,调用某些脚本进行文件操作,比如:头文件更新,或者动态链接库文件的更新等,需要借助脚本文件,并且不需要手动运行,那么如何使用Gradle呢? 如下代码 ...

  • 如何在Servlet中调用RESTfulAPIWeb服务

    假设我们需要搜索并显示指定城市的天气情况.互联网上有很多第三种Web服务.我正在使用百度天气Web服务进行演示.现在,让我们开始以下步骤. 使用代码转到您选择使用Web服务的网站,然后注册一个帐户并为 ...

  • 【编程】CG猎人python教程第001期 houdini中使用python案例

    --  微资讯 · 微课程  -- 利用零碎时间,走上超神之路! 专栏导读 小编想了好久该如何带大家入门编程:python的学习.如果从基本编程概念和一些数据类型入手是最常用的方法,但是可能会很无趣, ...

  • jmeter压测学习38-通过Jython调用Python脚本

    前言 前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jython.jar 的插件. Jython 是 Python 的纯 ...