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的。
如图:
我们再 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
下:
好了之后,使用pyinstaller
打包的时候加参数 -X
,或者在spec 文件
修改配置:
将upx
设置为 True
即可。
注意:upx 压缩后会略微增加应用启动速度。问题不大。
2、删除不需要的库或者模块
本来我是想直接把python 里没用到的模块 import 删除,百度了一下没找到好方法。
后来心生一计,看我操作:
可以看到我们打包后的大小:
进入目录:
找到你的库文件,看你python import了什么模块。
进去之后发现有一些根本用不到:
但是又不确定哪些没用到,这个时候可以先运行程序,然后在选中所有的DLL , 删除, 这个时候把能删的全删了,留下的就只有用到了的DLL 了。
我真他娘的聪明,且,帅!
删除之后的大小:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!