pyinstaller 打包—— Python + Qt 开发
PyInstaller是一款支持Windows、GNU/Linux、macOS、FreeBSD、OpenBSD、Solaris及AIX系统的Python程序打包工具,能够将Python脚本及其依赖项打包为独立可执行文件,便于在未安装Python的环境中运行。
简言之,pyinstaller就是将Python脚本打包成exe文件的工具。
1. 开发环境
win11 + Python3 + pyinstaller 6.20.0 + VSCode 1.119.0+PyQt5.15.11
2. 使用方法
2.1 参考
使用方法可参考以下博客,注意有些用法已不适用,注意识别!
【Python打包实战】PyInstaller完全指南:python项目打包为可执行程序、从入门到精通的项目打包教程-CSDN博客
2.2 用法和生成文件结构
下面只介绍一些关于pyinstaller的一些简单用法和生成文件结构:
pyinstaller通过命令行进行打包。可在项目所在的文件夹调用cmd,也可在VSCode打开项目的终端输入命令。
最简单的指令就是:
pyinstaller your_program.py
执行完成后,一般会在项目所在文件夹下生成一个名为【dist】的文件夹,结构如下,【dist】下的子文件夹以可执行文件名称命名,默认为"your_program",此子文件夹下包含生成的exe 和所依赖的库。
在生成【dist】文件夹的同时,也会对应的生成一个*.spec 的文件,此文件是打包的配置文件,后续可更改此文件配置,再执行命令,就会生成自定义配置的包。
pyinstaller main.spec
2.3 打包参数
可以添加一些选项参数修改默认值,比如使用--name指定可执行文件的名称:
pyinstaller --name myapp main.py
以下是一些常用的 PyInstaller 参数:
| 参数 | 说明 |
| --onefile | 将所有内容打包成一个单独的可执行文件。 |
| --onedir | 将内容打包到一个目录中(默认行为)。 |
| --name | 指定生成的可执行文件名称。 |
| --icon | 指定可执行文件的图标(.ico 文件)。 |
| --add-data | 添加额外的数据文件(格式:源路径;目标路径)。 |
| --add-binary | 添加额外的二进制文件(格式:源路径;目标路径)。 |
| --hidden-import | 添加隐藏的依赖模块。 |
| --console | 显示控制台窗口(默认行为) |
| --windowed | 不显示控制台窗口(适用于 GUI 程序)。 |
| --clean | 清理临时文件并重新打包。 |
| --distpath | 指定生成的可执行文件存放目录。 |
| --workpath | 指定临时文件存放目录。 |
2.2 针对PyQt5的打包
2.2.1 与PySide6 打包时冲突
报错:
ERROR: Aborting build process due to attempt to collect multiple Qt bindings packages: attempting to run hook for 'PySide6', while hook for 'PyQt5' has already been run
解决办法:命令行中明确不包含pyside6:--exclude-module PySide6
完整命令为:
pyinstaller -w -F --exclude-module PySide6 main.py
如果不用Pyside6,可以直接卸掉:
pip uninstall -y PySide6
2.2.2 不显示控制台窗口
一般GUI程序是不需要显示控制台的,可通过参数--windowed 设置。生成的exe是否包含控制台,图标也很好区分,如下:
pyinstaller --windowed main.py
2.2.3 路径问题
打包后的程序,使用过程中发现日志路径不对:
源代码中使用的 os.getcwd()获取的当前工作路径,然后拼的log路径,但是 os.getcwd()获取的可能不是exe所在的路径。
解决:
# 兼容 PyInstaller 打包的绝对路径
if getattr(sys, 'frozen', False):
# 打包后的 .exe 目录
BASE_DIR = Path(sys.executable).parent
else:
# 开发环境下的项目根目录 Path(__file__)为此代码文件路径
BASE_DIR = Path(__file__).resolve().parent.parent
2.2.4 关于警告WARNING: Hidden import "sip" not found!
SIP 是由 Riverbank Computing 开发的工具,专门用于自动生成 C/C++ 库的 Python 绑定,最初为 PyQt 开发,现已支持任何 C/C++ 库。
在打包过程中,打印信息会有这个警告,但是对打包好的exe使用是没有影响的。
原因就是:原本肯定是要使用这个库的,也就是命令行中,添加-hidden-import=PyQt5.sip (上面的参考博客中也有提到,不过是旧版,已不再适用了),导入PyQt5.sip,但是后续pyinstaller 工具为了方便,不再需要开发人员输入,而自己识别自动添加。然后PyQt5也不是没有发展进步,就是直接把这个库添加到自己库里了(之前PyQt5.sip是需要安装的),所以最终sip库还是导入了。

更多推荐

所有评论(0)