一、pyInstaller使用简介
Python程序打包成独立的.exe执行文件可以使用PyInstaller。打包对象包含依赖库、图像等资源文件,可以在没有安装python环境的电脑上运行(目前测试,只在win10系统上有效,win7以下系统会有报错提示)。
PyInstaller使用可以组合多种配置参数,用于打包和生成exe文件。
以下是网上找到的一些常用参数使用以及说明https://blog.csdn.net/zqzgng/article/details/134874366:
-F
或--onefile
:生成单个可执行文件-D
或--onedir
:生成一个目录,包含可执行文件和依赖文件-n
或--name
:指定生成的可执行文件或目录的名称-w
或--windowed
:生成无控制台窗口的可执行文件(即 GUI 应用)-c
或--console
:生成控制台窗口的可执行文件(即命令行应用)--icon
:指定应用程序图标文件的位置--hidden-import
:指定需要手动添加的 Python 模块(如果 Pyinstaller 未正确解析引用)--additional-hooks-dir
:指定一个目录,Pyinstaller 会在此目录中寻找自定义的 hook 文件,以添加额外的模块
命令行的使用实例如下:
pyinstaller -F -w -i my_icon.ico --name=test_app test_script.py
上述命令的作用是将test_script.py程序打包成没有控制台窗口(-w)的单个可执行文件(-F),指定其应用程序图标文件my_icon.ico(-i my_icon.ico),生成文件名为test_app(若不指定文件名,默认和.py文件同名)。
这里需要注意的是,-w参数的使用,当打包程序运行存在问题时,没有使用-w参数,错误提示会在控制台窗口显示,但是会闪退,使用-w之后会通过消息弹窗的方式提示。
二、PyInstaller使用过程出现的问题
1、在pycharm中运行没有问题,但打包出来却提示某模块找不到:
ModuleNotFoundError: No module named 'PyQt5.sip'
出现上述情况有一下几种情况:
(1)首先使用--hidden-import命令;
根据命令说明,可用作手动添加python模块,对于pyinstaller未正确解析应用的情况下使用;
我首先尝试该命令,但是没有用依然提示找不到模块;
(2)使用--additional-hooks-dir命令,俗称使用钩子脚本,即通过该脚本高速PyInstaller如何处理脚本中库文件;
流程如下
a、创建钩子脚本
首先,需要创建一个钩子脚本,告诉 PyInstaller 如何处理 PyQt5 库。在项目的根目录下创建一个名为 pyqt5_hooks.py
的文件,并将以下内容添加进去,假设这里是pyqt5的库有问题:
from PyInstaller.utils.hooks import collect_all
datas, binaries, hiddenimports = collect_all('PyQt5')
b、使用--additional-hooks-dir选项命令
在使用 PyInstaller 打包程序时,使用 --additional-hooks-dir
选项来指定包含钩子脚本的目录。假设你的钩子脚本存放在项目的 hooks
目录下,你可以这样使用 PyInstaller:
pyinstaller --additional-hooks-dir=hooks WatchdogProgram.py
这将告诉 PyInstaller 在打包过程中使用 hooks
目录中的钩子脚本。
执行上述命令后,PyInstaller将使用指定的钩子脚本处理PyQt5,并将其打包到可执行文件中。
多个库使用时只需在a步骤中将对应库的信息融合到一起就行,如还需要增加psutil库的使用:
from PyInstaller.utils.hooks import collect_all
# 处理 PyQt5 库
datas, binaries, hiddenimports = collect_all('PyQt5')
# 处理 psutil 库
datas_psutil, binaries_psutil, hiddenimports_psutil = collect_all('psutil')
# 合并结果
datas.extend(datas_psutil)
binaries.extend(binaries_psutil)
hiddenimports.extend(hiddenimports_psutil)
需要注意的是,该方法会使打包的exe文件非常大,需要慎重使用;
我在这里使用之后依然没有解决问题,经过仔细对比后发现问题如下;
(3)pycharm IDE的运行解释器版本和终端使用pyinstaller的python解释器版本不一样;
比如我这里命令行python环境时3.7.9,但使用pyinstaller时python版本为3.10.5(也是没有合理使用虚拟环境的恶果,具体原因现在不想去深究了);
解决办法就是将python解释器的版本切换成对应版本,反正使用PyInstaller要和Python配套;我这里是将解释器python换成3.10的,同时将对应使用的软件包进行下载;
然后重新使用上面的打包指令即可;
这里也需要注意,部分模块之间版本的依赖关系,我看网上提示PyQt5和PyQt5-sip版本不配套有可能会导致该问题,装来装去都不对,干脆将设计PyQt5的模块都卸载后,重新安装默认版本后,问题解决;