jsmubanlogo
  • 首页
  • 网页模板
  • 特效代码
  • 博文源码
  • 插件下载
  •    

python打包成exe

收藏    

作者第十天    2021-12-16

      

6. 打包成exe

首先要大致了解一下Pyinstaller打包.py的原理,
根据PyInstaller Manual,可知 PyInstaller将Python应用程序及其所有依赖项捆绑到一个包中。 用户无需安装Python解释器或任何模块即可运行打包的应用程序。 PyInstaller支持Python 3.5或更高版本,并正确捆绑了主要的Python软件包,例如numpy,PyQt,Django,wxPython等。

打包完之后运行XX.exe 可能会出现一闪而过的情况(程序执行完就结束了,根本看不清控制台输出了什么),参考解决pyinstaller打包发布后的exe文件打开控制台闪退的问题,直接切到xx.exe程序存在的目录,使用命令行进行运行,就可以咧。
例如:
在这里插入图片描述

打包很简单,直接切到要打包的入口py文件所在的文件夹,命令行输入:

pyinstall xxx.py -F(打包后只生成单个exe格式文件) -w(不使用控制台) -i=xxx.ico(修改生成exe的图标)
  • 1
  • -c 使用控制台 默认
    然后就可以在dist文件夹里看到生成的 exe文件了

6.1 简单的加速

pyinstall xxx.py -F(打包后只生成单个exe格式文件) -w(不使用控制台) -i=xxx.ico(修改生成exe的图标)
  • 1

采用上面这种 -F参数之后,打包得到的exe差不多10MB,但是执行速度奇慢。。。

参考:pyinstaller生成的小程序exe启动花费4秒,能有啥办法优化编译一下吗?

  1. 去掉-F参数(这个参数会将生成的文件压缩全都打包进exe中,而执行的时候其实还是要解压到一个临时目录中,所以会导致程序运行速度变慢)
  2. 加入-w参数 不使用控制台(执行时不会弹出控制台的黑框(不过这样一些print信息就输不出来了,不利于调试))

加入-F和不加的区别,如下图
在这里插入图片描述
运行后者,速度非常快,基本和运行.py文件速度一样

6.2 原理解释

官方解释:翻译(来自:stack overflow-Speeding up an .exe created with Pyinstaller中一个回答帖的链接:)

  • 官方文档—What PyInstaller Does and How It Does It,关于pyinstaller如何打包成一个.exe并运行的(简单来说:需要提取程序的完整环境并将其写入临时文件夹。)

原文翻译:结合谷歌翻译自己看就行了,需要注意的几点:

  1. 使用Pyinstaller打包得到的.exe文件是特定于具体的操作系统和特定的python版本的,即如果要为以下的环境准备发布版本:

    • 不同的操作系统
    • 不同的Python版本
    • 32/64位不同

    则可以在那个python版本,那个操作系统下运行Pyinstaller。然后执行Pyinstaller的Python编译器是bundle(包)的一部分,它会特定于具体的操作系统和特定的字长。

  2. 打包成一个文件夹,其优点(2个)和工作方式如下:

    • 传输方便(压缩,解压到另一个电脑,双击exe文件就可以运行),而且debug方便,使用这一方式时,很容易调试在打包exe时出现的问题。可以确切地看到PyInstaller收集了哪些文件到该文件夹中。
    • 另一个有点是如果代码发生了改变(不涉及依赖包的改变的话),只需要发给别人更新过的.exe文件就可以,这比更新整个文件夹要方便的多。(反之,如果脚本引入了新的依赖包或者更改变了依赖包,就需要重新分发这一整个文件夹)
    • 工作方式:打包的文件始终在Pyinstaller的bootloader(根引导)中开始执行,这是打包的文件夹中可执行文件的核心。 Pyinstaller bootloader是活动平台(windows GNU/linux Mac OS等)上的一个二进制可执行程序,当用户启动程序时,其实是bootloader在运行。bootloader 创建了一个临时的Python虚拟环境,这样Python编译器(interpreter)就可以在这个脚本文件夹中找到所有引入的模块/库。bootloader启动了一个Python编译器的副本来执行脚本,后续的执行正常都是从这里开始的,提供被包括在脚本文件夹中所有支持的文件。
      大概就是这样,如果想看具体的细节,参见The Bootstrap Process in Detail
  3. 打包成一个单独的文件,优缺点及工作方式如下:

    • PyInstaller可以把所有的脚本及其依赖包都打包到一个.exe文件中,优点就是看不懂文件夹中其他内容的用户可以只得到一个可以理解是啥的.exe文件,缺点是每次更新都要重新发布全部内容(一个.exe 不过体积会大一些),同时,单个文件比单个文件夹启动要慢
    • 在单文件模式下,bootloader也依然是核心。启动时,会在当前操作系统的合适的临时文件夹就下创建一个临时的文件夹,这个文件夹的名字类似于_MEIxxxxxx,其中xxxxxx是一串随机生成的数字。 这个可执行文件包括:你的脚本所使用的的所有python模块的一个嵌入式存档,同样还有所有非Python支持的文件(例如:.so文件)压缩的副本。bootloader 会解压这些文件并将其写入临时文件夹中,这会花费点时间,这就是为什么单个exe方式会比单个文件夹方式启动慢的原因。

6.3 其他打包库

搜索过程中,还发现了一个叫nuitka
参考:nuitka打包的exe比用pyinstaller打包的exe运行速度快?

还有个叫cx_freeze
参考:Executable generated with pyinstaller is slower than cx_freeze

7.pyinstaller的其他问题

7.1 双击exe 不弹出黑框

参考Stack Overflow回答:
Getting rid of console output when freezing Python programs using Pyinstaller

方案1
在这里插入图片描述
加入一个--noconsole参数,使用以下代码:

pyinstaller --noconsole XXX.py
  • 1

参数说明来自pyinstaller文档
在这里插入图片描述


方案2

在这里插入图片描述
先用pyinstaller打包一次,然后在产生的.spec文件(和pyinstaller -F xx.py的.py文件同名),打开在这里插入图片描述
在这里插入图片描述
将这里的True改成False,然后运行:

pyinstaller your_script.spec
  • 1

参考链接

  • python带参数打包exe及调用方式
  • 一文看懂Python封装成可带参数的EXE安装包
  • 关于python 打包带传参的 .exe 文件一些经验教训
  • PyInstaller用法
  • Pyinstaller打包exe策略(简单实用)
  • 官网英文文档-Using PyInstaller


免责声明:
      1、 资源售价只是赞助,不代表代码或者素材本身价格。收取费用仅维持本站的日常运营所需。
      2、 本站资源来自用户上传,仅供用户学习使用,不得用于商业或者非法用途,违反国家法律一切后果用户自负。用于商业用途,请购买正版授权合法使用。
      3、 本站资源不保证其完整性和安全性,下载后自行检测安全,在使用过程中出现的任何问题均与本站无关,本站不承担任何技术及版权问题,不对任何资源负法律责任。
      4、 如有损害你的权益,请联系275551777@qq.com及时删除。

关于我们 | 积分获取 | 联系我们 | 用户协议 | 标签搜索 | 网站地图.html | 网站地图.xml | 网站地图.txt

Copyright © 2021-2023 All Right Reserved
陕公网安备 61082202000148号      陕ICP备2025078528号-1
js模板网 -陕西千手码农科技有限责任公司