PyInstaller使用以及部分注意

本文详细介绍了如何使用PyInstaller将Python程序打包成独立的.exe执行文件,包括单文件(-F)和目录(-D)打包,以及处理在打包过程中遇到的ModuleNotFoundError,如PyQt5模块缺失问题。着重讲解了如何通过--hidden-import和--additional-hooks-dir命令添加手动导入模块和自定义钩子脚本。还提到了版本兼容性问题对打包的影响和解决方案。
摘要由CSDN通过智能技术生成

一、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的模块都卸载后,重新安装默认版本后,问题解决;

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值