python GUI在开发好之后,我们需要将其打包成exe文件,并使其不依赖python环境运行,这个时候需要用到pyistaller。
目录
获取方式
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pyinstaller
通过命令行打包
pyinstaller主要是通过命令行的形式来进行操作,下表给出了常用的命令行及使用方法
常用命令
命令选项 | 描述 | 示例 |
---|---|---|
--onefile或 -F | 将所有依赖项打包到一个可执行文件中。 | pyinstaller --onefile main.py |
--windowed 或 -w | 不显示控制台窗口(适用于 GUI 应用)。 | pyinstaller --windowed app.py |
--console 或 -c | 显示控制台窗口(默认行为,适用于需要终端的应用)。 | pyinstaller --console script.py |
--name=APPNAME | 指定生成的应用程序名称。 | pyinstaller --name MyApp app.py |
--icon=ICONFILE或-i | 指定应用程序图标(支持 .ico 、.icns 等格式)。 | pyinstaller --icon=app.ico main.py |
--noconfirm | 覆盖输出目录而不提示确认。 | pyinstaller --onefile --noconfirm script.py |
--clean | 在构建之前清理 PyInstaller 缓存和临时文件。 | pyinstaller --clean main.py |
--add-data"SRC;DEST" | 添加额外的数据文件或目录(Windows 使用 ; ,Unix 使用 : )。 | pyinstaller --add-data "data;data" app.py |
--add-binary "SRC;DEST" | 添加额外的二进制文件或库(Windows 使用 ; ,Unix 使用 : )。 | pyinstaller --add-binary "lib/libexample.so:lib" app.py |
--hidden-import=MODULE | 手动指定隐藏的导入模块,防止 PyInstaller 未自动检测到。 | pyinstaller --hidden-import=module_name app.py |
--exclude-module=MODULE | 排除不需要的模块,减小包体积。 | pyinstaller --exclude-module=tkinter app.py |
--upx-dir=UPX_DIR | 指定 UPX 可执行文件的路径,用于压缩可执行文件。 | pyinstaller --upx-dir=/path/to/upx app.py |
--distpath=DISTPATH | 指定输出的可执行文件存放目录(默认为 dist/ )。 | pyinstaller --distpath=./build app.py |
--workpath=WORKPATH | 指定临时工作目录(默认为 build/ )。 | pyinstaller --workpath=./temp app.py |
--specpath=SPECPATH | 指定 .spec 文件的输出目录(默认为当前目录)。 | pyinstaller --specpath=./specs app.py |
--log-level=LEVEL | 设置日志级别(如 DEBUG , INFO , WARN , ERROR , CRITICAL )。 | pyinstaller --log-level=DEBUG app.py |
--version-file=FILE | 指定版本信息文件,用于在可执行文件中嵌入版本信息。 | pyinstaller --version-file=version_info.txt app.py |
--exclude-module | 排除指定的模块,减小最终包的大小。 | pyinstaller --exclude-module=test app.py |
--key=ENCRYPTION_KEY | 对 Python 字节码进行加密(需要额外支持)。 | pyinstaller --key=your_encryption_key app.py |
--debug=MODE | 启用调试模式,可以设为 all , imports , bootloader , 等。 | pyinstaller --debug=all app.py |
示例
为了方便,我们在待打包文件目录下的cmd命令行内使用pyinstaller,这样可以不指定文件路径,只需要指明文件名称即可。
- 找到待打包py文件所在的文件夹
2.鼠标单击位置栏
3.删除掉蓝色选中部分,并输入cmd
4.按下回车,进入到当前文件夹路径下的cmd命令面板
5.输入命令
这里我们希望将所有内容打包到一个exe文件内,所以pyinstaller命令应该是:
pyinstaller -F -w -i ‘icon图片的位置或名称’ ‘打包py文件的位置或名称’
这个命令表示打包时的gui运行时不会弹出控制台,并且有icon。
输入命令后按下回车等待,不要关闭当前cmd命令窗口,否则打包失败!直到cmd命令窗口内的字体不再滚动并在最后一行出现Successfully语句的时候,打包完成。
返回之前的文件夹,我们发现会多出两个文件夹,build和dist,此时build没用了,可以删掉,dist文件夹下的便是我们打包好的exe文件,可以将其移动到桌面或其他位置独立使用了 。
注意事项
1. exe文件的icon必须是.ico格式,jpg或png格式将会在使用-i命令时报错提醒icon文件需要为.ico格式。
2.pyinstaller只能用过来打包.py类型文件,若你的项目中用到了图片等类型数据,尽可能的全部转化为py文件然后再打包。
3.如果不指定icon路径或者在命令中没有使用-i,那么你的exe文件打包后的icon是:
自定义.spec文件打包
在使用pyinstaller命令后,会在我们待打包文件同级目录下生成一个.spec文件,这个文件内包含了待打包文件的所有打包参数配置:
.spec文件的格式如上图,不难发现,EXE括号内的各个参数实际上就是我们前边表格中的命令对应的效果,因此我们直接在这个文件内进行编辑,即可实现同样的效果。
在本地生成.spec文件
pyinstaller --name= py文件名称.py
运行这个命令行后,将会在你的py文件同目录下生成一个空的.spec文件,这个文件与上图相比
除了Analysis内第一个列表是你的py文件名称以外,其余位置都是默认值。
编辑.spec文件
spec文件主要内容:
- Analysis: 定义了要打包的脚本及其依赖项。
- EXE:定义了最终生成的可执行文件的属性。
- Collect: 定义了如何收集和打包所有资源文件。
一般而言,我们只需要修改Analysis和EXE即可。
倘若你想修改打包后的exe文件名称,那么只需要将EXE中的name的值修改为:
name='我的exe文件'
倘若你不想再运行exe文件时弹出黑色的终端窗口,那么只需要将EXE中的console的值修改为:
console=False
倘若你想要指定打包后的exe文件的icon,那么只需要将EXE中的icon的值修改为:
icon=['myicon.ico']
在.spec文件内修改这三个位置的参数后,其实和我们前边使用:
pyinstaller -F -w -i ‘icon图片的位置或名称’ ‘打包py文件的位置或名称’
这个命令行参数效果一样,唯一区别在于使用这个命令行打包后文件的名称是py文件的名称。
解决打包后某些库功能无法正常使用的问题
大家在将自己的python项目按照上述格式打包后,有时候会发现,为什么某个库的某个函数不起作用呢?
这其实是因为我们的py文件内用到的这个库依赖一些非py文件,那我们必须将这个非py文件在我们电脑上的路径(一般是python的site-package下的这个库的名称,也就是pip命令下载的位置)以及文件名称传入到Analysis的data中 一起打包后,exe文件才能正常使用。
这里以我之前做过的一个项目为例,这个项目中用到了ddddocr这个库,dddocr是用C开发的,python作为接口的一个OCR(光学识别,用来识别图片验证码)库,因此,我们需要将调用的dll文件传入到data内,否则即使打包成功也无法使用!
datas=[("C:\\Users\\MrCrab\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\onnxruntime\\capi\\onnxruntime_providers_shared.dll","onnxruntime\\capi"),("C:\\Users\\MrCrab\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\ddddocr\\common.onnx","ddddocr")]
需要注意的是,每个文件要按照(路径,文件名)的元祖格式传入到Analysis的data列表。
总结
以上便是pyinstaller在打包python文件中的详细教程,看完这篇文章你将掌握使用pyinstaller打包python文件的技能!