Python 脚本基础模块

Python Pyinstaller打包心得

@firestaradmin 2022年9月24日16:31:58

死亡不是为了安息

简介:

不需多说

安装:

pip install pyinstaller

国内源:-i https://xxxxxx

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

打包命令:

pyinstaller -F ./main.py
pyinstaller -D ./main.py -i xxx/icon.ico

命令详解:

-F, –onefile 打包成单个可执行文件,但如果有一些配置文件或者外部资源的话就不能使用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w, –windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c, –nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)
-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-i, 指定Icon 改变程序的图标  pyinstaller -i ico路径 xxxxx.py
-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)

依赖文件:

有时候程序会用到一些 json 配置文件或者一些外部图片等文件,需要添加依赖一并打包。

依赖文件只能使用 onedir 模式打包 也就是 -D

在第一次执行命令打包后,默认会在当前目录生成一个 名为 打包的py文件的名字.spec ,这个文件就是用来配置pyinstaller的。

如图:

image-20220924164752927

我们再 datas=[] 里添加依赖文件即可:

datas=[
    ('./settings.json','./'),
    ('./gui/themes','./gui/themes'),
    ('目标文件或目录','目的文件目录')
],

缩小文件体积:

1、使用 UPX 压缩:

UPX 是一个免费的、安全的、可移植的、可扩展的、针对多种可执行格式的高性能可执行封装器。

官网地址:UPX: the Ultimate Packer for eXecutables - Homepage https://upx.github.io/

Github: upx/upx: UPX - the Ultimate Packer for eXecutables (github.com)

下载后解压的EXE 放到pyinstaller.exe 路径下,或者设置环境变量到 upx.exe,自己选择

pyinstaller.exe 路径一般在 python根目录的scripts 下:

image-20220924165816469


好了之后,使用pyinstaller 打包的时候加参数 -X ,或者在spec 文件修改配置:

image-20220924165356941

upx 设置为 True 即可。

注意:upx 压缩后会略微增加应用启动速度。问题不大。

2、删除不需要的库或者模块

本来我是想直接把python 里没用到的模块 import 删除,百度了一下没找到好方法。

后来心生一计,看我操作:

可以看到我们打包后的大小:

image-20220924165913363

进入目录:

image-20220924165945538

找到你的库文件,看你python import了什么模块。

进去之后发现有一些根本用不到:

image-20220924170043450

但是又不确定哪些没用到,这个时候可以先运行程序,然后在选中所有的DLL , 删除, 这个时候把能删的全删了,留下的就只有用到了的DLL 了。

我真他娘的聪明,且,帅!

删除之后的大小:

image-20220924170216808


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!