使用pyinstaller打包python PyQt5程序

目录
  • 准备
    • 工具准备
    • 源代码准备
    • 打包
    • 参数说明
  • 针对PyQt应用的改进
    • 目前的小问题
    • 解决办法
    • 再次打包
  • 代码仓库说明

当你有打包你的python应用的需求以后,你可能会像搜索引擎寻求帮助,你或许曾经搜索过“python 转 exe”,“python打包”等等这样的字眼,你或许曾看到过各种各样的相关解决方案,本文介绍的是其中的一种,但是可以负责任的说,这是目前最好的方案,并且是跨平台最好的方案,也就是说使用这个叫pyinstaller的工具,你可以把同样的代码打包在Windows,Linux以及macOs上运行。

这个工具的名称就是pyinstaller,官方主页:
http://www.pyinstaller.org/

这个工具将打包工作封装成一条简单的指令就能完成的动作。

准备

工具准备

第一件事情当然是安装这个库了,和往常一样,使用pip

pip install pyinstaller

源代码准备

因为我们是针对一个GUI应用来打包,那么我们需要简单的改造一下源代码,如果你是在打包命令行,则不需要进行这个操作。

首先,我们要创建一个入口文件,名称为 wifidrop.pyw,名字无所谓,它将成为你最终的软件名称,这里需要注意的是,我们的文件后缀为pyw,比py文件后缀多了一个w,而w的意思是window,也就是说告诉python环境,我们这个软件是一个窗口应用,如果不这么做,在运行软件的时候,除了有我们的GUI界面以外,python还会留 一个命令行窗口在后边,这显然不是我们想要的,而使用了pyw后缀以后,python则不会显示命令行窗口。

在 wifidrop.pyw 不需要做什么太多东西,仅仅是简单的调用main.py中的main函数就可以了。

import sys
from main import main

if __name__ == '__main__':
    excode = main()
    sys.exit(excode)

打包

做好代码相关的准备以后,就可以使用pyinstaller来打包软件了,过程也非常简单,一行命令就能解决,在命令行中运行

pyinstaller --clean -F -w wifidrop.pyw -i Treetog-I-Documents.ico

参数说明

–clean :告诉pyinstaller删除缓存和临时文件
-F :告诉pyinstaller将打包的结果放在一个exe文件中,也就是说最终结果将只有一个exe文件,如果不使用这个参数,那么结果会是一个exe加很多依赖文件,不利于我们分发软件。
-w :告诉pyinstaller我们要生成的是一个窗口应用
-i :为我们的应用指定一个图标,否则默认的话会使用python图标
一般来说,这些参数就足够日常使用了,如果需要更深入的功能,比如加密等等,就需要阅读手册了。

这条命令成功运行完以后,你将会在项目目录中看到build和dist两个文件夹,最终的可执行文件就放置在dist文件家中。

针对PyQt应用的改进

目前的小问题

当我们尝试运行在dist中生成的wifidrop.exe文件的时候,你将发现,程序无法运行,不知道你还有没有印象,至今为止,我们都一直在main.py中使用loadUi函数加载Qt Creator创建的ui的方式来创建GUI界面,那么仔细观察一下dist文件夹中,里边并没有ui文件,对吧?

因为pyinstaller仅仅是一个py应用的打包工具,它并不知道其他的文件的存在,所以,你可以尝试把我们的两个ui文件拷贝到dist文件夹中之后再运行这个exe。

你会发现现在应用可以正常使用了。但是这样会不会有什么风险?

对了,ui文件说白了是一个xml格式的文本文件,如果使用我们软件的人有意或者无意的修改了这两个文件中的内容,我们的软件极有可能就没办法运行了,因此,在分发我们的软件的时候,要避免使用ui文件。

ui文件的好处是在开发的时候,可以迅速的通过Qt Creator修改UI。

解决办法

当然PyQt也提供了很好的解决办法,它提供了一个小脚本,可以帮我们把ui文件转成py文件,并将UI转换成类。我们通过运行下边这两条命令,将mainwindow和dialog转成python类。

python -m PyQt5.uic.pyuic -x dialog.ui -o dialog.py
python -m PyQt5.uic.pyuic -x mainwindow.ui -o mainwindow.py

每一个ui文件会对应一个py文件,而py文件中会有相应的类。

有了py模块以后,我们还需要在实例化ui的地方(也就是main.py)中将加载ui文件的方式改为实例化python类的方式来加载ui,分别要修改MainWindow和SendDialog的初始化函数,选择2 option的方式来加载ui

class MainWindow(QMainWindow):
    """Main window"""
    def __init__(self):
        super(MainWindow, self).__init__()

        # UI setup - 1 option
        # dynamic load ui for development purpose
        # self.ui = loadUi('./mainwindow.ui', self)

        # Use py to setup UI - 2 option
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setStatusBar(None)  # https://doc.qt.io/qt-5/qmainwindow.html#setStatusBa
class SendDialog(QDialog):
    def __init__(self, url_list, socket_server_thread, device_discover_thread, socket_broadcast):
        super(SendDialog, self).__init__()

        # UI setup - 1 option
        # dynamic load ui for development purpose
        # self.ui = loadUi('./dialog.ui', self)

        # Use py to setup UI - 2 option
        self.ui = Ui_dialog()
        self.ui.setupUi(self)

再次打包

代码修正之后,我们来使用上边相同的pyinstaller命令打包,成功运行后,点击生成的wifidrop.exe,你会发现在无需ui文件的情况下,软件也能很好的运行了。

代码仓库说明

本文中用到的打包命令和ui转py命令,可以在github 仓库 https://github.com/pythonlibrary/wifidrop 中的 tutorial-6-direct-dist 和 tutorial-6-dist tag下找到,这两个tag的区别是:前一个使用了加载ui文件的方式显示UI,后边一个修正了这个问题,使用类实例化的方式显示UI。

更多关于使用pyinstaller打包python程序的文章请查看下面的相关文章

(0)

相关推荐

  • 教你使用pyinstaller打包Python教程

    一.单个文件打包 1.1 简单打包 例如现在有一个main.py文件内容如下 import os print("hello world") os.system("pause") 运行结果如图 现在用一下命令打包成一个可执行文件pyinstaller -F main.py 再同级目录下生成一个dist文件夹里面就会生成一个可执行文件,双击就可以执行 1.2 带图标打包 有的时候为了美观,可以给可执行文件加一个图标,这时用这个命令pyinstaller -F main.

  • 解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题

    解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题 最近写一个小脚本,源代码200多行,引入了 openpyxl.requests库,写完打包exe之后居然有64MB的大小,真是奇了葩了.网上查找各位大神的做法,自己又动手填了N个坑之后,总算找到缩小exe文件的方法了,这种方法必须使用到pipenv,详细记录如下: 1.安装pipenv 就像安装其他python库一样,在cmd环境下安装: pip install pipenv 2.安装完成后,随便找一个盘符,在这个

  • python3.9实现pyinstaller打包python文件成exe

    简述 1.python python作为一门解释型脚本语言,它有三种发布方式: 文件 : 源码文件,运行需要使用者安装Python环境并且安装依赖的各种库 pyc文件:pyc文件是Python解释器可以识别的二进制码,可跨平台的,需要使用者安装相应版本的Python和依赖库. 可执行文件:不需要安装python环境和依赖库,可针对不同平台需要打包不同的可执行文件(Windows,Linux,Mac,-) 2.pyInstaller PyInstaller工具可以把python解析器和脚本打包成一

  • 如何利用pyinstaller打包Python程序为exe可执行文件

    序 对于如何将py文件打包生成exe可执行文件最简单的应该我觉得就是使用pyinstaller第三方模块 下面我就分为三个步骤给大家讲解如何使用 并分享一点小技巧 下面直接进入分享啦 安装pyinstaller第三方库 既然要安装第三方库,当然离不了pip install啦 直接使用pip install pyinstaller就可以安装啦 (不过这样似乎遇到第三方模块比较大的话就很慢甚至无法成功安装啦 ) 安装第三方库的小技巧 当然有解决办法呀 那就是使用国内镜像源 添加后就像是开挂了的 pi

  • 总结Pyinstaller打包的高级用法

    一.安装pyinstaller PyInstaller是一个用来将Python程序打包成一个独立可执行文件的第三方包. 因是第三方包,所以需要安装一下: pip install pyinstaller 或者升级到最新版本: pip install --upgrade pyinstaller 或者安装开发者版本: pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz 当然了,也可以下载whl文件,

  • 解决Pyinstaller打包软件失败的一个坑

    最近写了一个软件屡屡打包不能正常运行,而直接在cmd命令行窗口运行却都能正常输出,没有任何报错,一开始怀疑程序里面sys.args[1]使用不对,找了很久发现import numpy才是导致代码不能打包的直接原因. 不知道为何引用这个包就不能正常打包成exe了. 程序编译中出错的代码如下 pyinstaller -F C:\Users\LHD_PC\AppData\Local\Progr ams\Python\Python38-32\Scripts\AutoElecCalcE.py 91 INF

  • python之pyinstaller组件打包命令和异常解析实战

    项目场景: Python版本:3.8 因公司业务需求,须开发一套局域网内视频会议软件,此次采用Python实现此功能. 程序编写完并在编译器实现此功能后,采用pyinstaller组件打包成应用程序 问题描述: 在使用pyinstaller组件打包过程中,着实遇到一些问题,以下列出此次遇到主要的问题: 1.如何打包多个文件? 2.打包完运行后控制台显示"找不到指定模块.mkl_intel_thread.l.dll",图示如下: 3.打包如何排除不需要的组件以减少包的大小? 4.待补充

  • Pyinstaller打包文件太大的解决方案

    废话不多说 原因: 在Anaconda下打包的很多不必要的模块进去,导致最终的exe文件过于庞大. 解决办法: 要用纯净的python来打包即可避免加入不必要的包,那么如何快速地建立纯净的python环境呢? 当然不用重装python,只需要通过pipenv建立虚拟环境即可.在虚拟环境下打包,最终的exe文件会非常小(几M). #第一步,建立虚拟环境 pipenv install #第二步,进入虚拟环境 pipenv shell #第三步,安装自己最终打包的py文件下需要的模块即可 pip in

  • 使用pyinstaller打包python PyQt5程序

    目录 准备 工具准备 源代码准备 打包 参数说明 针对PyQt应用的改进 目前的小问题 解决办法 再次打包 代码仓库说明 当你有打包你的python应用的需求以后,你可能会像搜索引擎寻求帮助,你或许曾经搜索过"python 转 exe","python打包"等等这样的字眼,你或许曾看到过各种各样的相关解决方案,本文介绍的是其中的一种,但是可以负责任的说,这是目前最好的方案,并且是跨平台最好的方案,也就是说使用这个叫pyinstaller的工具,你可以把同样的代码打包

  • python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

    本文介绍一个exe打包工具pyinstaller,使用非常简单.方便,而且还跨平台. 软硬件环境 Windows 10 64bit PyQt5 Anaconda with python 3.6.5 pyinstaller apscheduler sqlalchemy pyinstaller安装 命令行中执行 pip install pyinstaller pyinstaller打包exe 示例还是以之前的为例,解压进入工程目录,命令行执行打包命令 pyinstaller -F --distpat

  • 基于Pyinstaller打包Python程序并压缩文件大小

    这段时间应老师的要求,给实验室写了一个基于 PyQt5 的小工具.然而源码发过去人家还不要,一定要打包成可执行软件. 那就打包呗,刚好以前对 Pyinstaller 有一点接触,就用了一下这玩意.这篇博文主要记录一下基本用法和踩得一些坑. 1. 用 Pyinstaller 打包 Python 程序 首先我们需要安装 Pyinstaller: pip install pyinstaller 用 conda 也行,不过貌似最近清华的 Anaconda 源被封了,也不知道什么时候解禁. Pyinsta

  • 解决pyinstaller打包pyqt5的问题

    pyinstaller打包使用pyqt5模块的时候,在win平台下,由于pyinstaller无法准确获取QT动态库文件路径,会报错导致无法打开运行程序,并提示错误信息pyinstaller failed to execute script pyi_rth_qt5plugins此时我们需要在打包的时候直接告诉pyinstaller到哪里去找,这个路径分隔符需要是unix形式: pyinstaller --paths C:/****/Python/Python35-32/Lib/site-pack

  • pyinstaller打包python3.6和PyQt5中各种错误的解决方案汇总

    目录 前言: 1. WARNING: lib not found: api-ms-win-crt-string-l1-1-0.dll dependency 2. 打包完成后运行时出现 "fail to excute script" 总结 前言: 最近在学习单片机,老师要求自己写串口通信的上位机程序,我采用比较简单的pyqt5+serial模块来完成任务,pycharm测试一切正常,在用pyinstaller打包时出现了很多错误,查询了很多资料后得到了解决,这里汇总一下解决的方法 1.

  • 如何使用pyinstaller打包多个和单个python文件详解

    目录 一.打包多个 二.打包单个文件 总结 一.打包多个 1.将需要打包的项目为anjuke_sd目录下的所有python文件,其中excute_main.py为主文件. 2.生成主函数对应的spec文件 命令:在anjuke_sd路径下使用:pyi-makespec excute_main.py 如下图已经生成excute_main.spec文件. 3.修改spec文件:加入需要打包的所有python文件,同时确保以下两项包含该项目的路径 4.对spec文件进行pyinstaller安装 命令

  • Pyinstaller 打包发布经验总结

    使用Pyinstaller打包Python项目包含了大量的坑,这篇文章总结实践得到的Pyinstaller打包经验.本文的例子为Python3.6代码,Pyinstaller3.4,在windows下打包为64位和32位版本. Pyinstaller基本使用方法 Pyinstaller可以通过简单的命令进行python代码的打包工作,其基本的命令为: pyinstaller -option xxx.py options的详情可参考官方帮助文档https://pyinstaller.readthe

随机推荐