IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 猿创征文|pyinstaller打包Python程序时,文件过大等问题的解决方案 -> 正文阅读

[Python知识库]猿创征文|pyinstaller打包Python程序时,文件过大等问题的解决方案


众所周知,pyinstaller常规的打包方法为

pyinstaller -w -F xxx.py

其中,-w表示在执行文件时不打开命令行;-F表示生成单个文件(file)。不加这两个参数,会默认为打开命令行,并把程序生成在一个文件夹中。

通过pyinstaller -F打包程序有以下几个问题

  1. 生成文件的图标是固定的,打开文件后窗口的图标也是固定的,而且这两个图标并不相同
  2. 生成文件过大,几百兆起步
  3. 生成单文件,则启动速度很慢,几秒钟起步
  4. 如果使用窗口程序的同时还用了多进程,会使得每个进程都创建一个窗口

接下来,对这四个问题逐一解决。

图标问题

pyinstaller提供了-i参数,可以用自己的图标来替换

pyinstaller -F -w -i ./yyy.ico xxx.py

但这个图标仅仅表示生成可执行文件的图标,而打开软件后,窗口左上角的图标并非pyinstaller规定的,而是Python所调用的窗口模块所决定的。以tkinter为例,可通过调用iconbitmap来规定

win.iconbitmap("yyy.ico")

在使用pyinstaller打包之后,尽管将图标文件放在了可执行文件所在的文件夹里,但并没有什么卵用。换言之,打包之后的程序可能找不到ico文件,所以一个解决方案是,将ico文件转换为其他可以找到的文件。

具体方法是,将ico文件编码为字符

import base64
# yyy.ico为准备打开的图标文件
# tmp.txt为另存为的文本文件
with open("yyy.ico","rb") as i:
    b64str = base64.b64encode(i.read())
    with open("ico.txt","ab+") as f:
        f.write(b64str)

然后在Python的窗口程序中,将ico.txt打开,复制其中的内容,将其作为字符串赋给一个变量,设这个变量为ICON_TXT,然后将

import tkinter as tk
from icon import Icon
import base64
# 打开文本文件,获取数据
with open("ico.txt","rb") as tmp:
    ICON_TXT = tmp.read()
# 新建图标文件

root = tk.Frame()
with open('tmp.ico','wb') as tmp:
   tmp.write(base64.b64decode(ICON_TXT))
root.iconbitmap('tmp.ico')      #调用
os.remove('tmp.ico')            #删除

生成文件过大的问题

原因很简单,是因为打包的过程中将大量不需要的模块一同打进去了。网上流传的解决方案几乎都是用conda创建一个Python环境,从而只下载自己想要的包。

但网传的大部分见解都语焉不详,就算用conda新建一个python环境,同样也会在创建过程中载入大量不需要的模块,所以问题的关键是创建一个纯净的Python环境。

conda当然是可以做到的,其命令格式为

conda create --name envname --file env.txt

其中,envname为想要创建的虚拟环境的名字;--file说明conda将遵照一个文件来创建Python环境,后面跟着的env.txt就是这个文件,其内容为

@EXPLICIT
https://repo.anaconda.com/pkgs/main/win-64/python-3.9.7-h6244533_1.tar.bz2
https://repo.anaconda.com/pkgs/main/win-64/pip-22.1.2-py39haa95532_0.tar.bz2

这两个网址分别是python3.9和其对应的pip的网址,如果想安装其他模块或者不同的版本,当然也可以修改。

如果将要打包的项目需要用到其他模块,需要在conda环境中,用pip来进行安装。

> conda activate envname
> pip install numpy
> pip install pyinstaller

而且,务必用pip重新安装一次pyinstaller,这样保证在这个纯净的python环境中调用的也是一个纯净的pyinstaller。

对比之下,使用普通conda环境打包的独立可执行文件233MB,使用纯净conda环境输出独立可执行文件22MB,可以说效果相当明显了。

打开速度过慢问题

所谓单文件版,可以简单地理解为把程序做了一个压缩,然后在点击这个可执行文件后,将压缩好的这些文件解压出来,解压之后再正常使用。

所以打开速度过慢的主要原因就是文件太大了,一个几百兆的文件和一个几十兆的文件,解压速度不可同日而语。在这个意义上来讲,解决了生成文件过大的问题,也就相当于解决了打开速度慢的问题。

那么,有没有更快的办法呢?

答案当然是有滴,只要找到一种比较快的解压方法就可以了,而封包工具还是比较多的,比如enigama virtualbox

首先,用pyinstaller -D的方法,将python代码以文件夹的形式打包。

pyinstaller -w -D test.py

然后,打开enigma virtualbox,设置好输入和输出的可执行文件,把pyinstaller生成的文件夹递归加入,然后点击打包,就可以生成单文件了。

在这里插入图片描述

最后尽管输出的文件比pyinstaller打包的单文件要稍大一些,但启动时的速度快了很多。

多线程问题

这个问题反而很好解决,只需在程序入口添加一条语句

import multiprocessing
if __name__ == '__main__':
    multiprocessing.freeze_support()

关于freeze_support的用法,在Python的官方文档上有写,是专门用于冻结multiprocessing程序生成Windows可执行文件的。

而且标准库文档还特意强调,在 py2exe, PyInstaller 和 cx_Freeze 上测试通过。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:10:10  更:2022-09-13 11:10:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 13:38:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计