PyInstaller是一款支持Windows、GNU/LinuxmacOSFreeBSDOpenBSDSolarisAIX系统的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
不含console
默认:含console

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库还是导入了。

更多推荐