PyInstaller打包exe闪退,No Model named XXX问题

本文介绍了如何处理在PyInstaller打包exe程序时遇到的闪退问题,重点讲解了查看报错信息、使用`--hidden-import`解决`Nomodulenamed`错误,以及PyInstaller的hooks机制。通过自定义hooks文件或在命令行中添加`hiddenimports`来确保模块依赖的正确处理。
摘要由CSDN通过智能技术生成

目录

〇、问题描述

一、exe闪退如何查看报错信息

二、解决No module named 'xxx'

三、PyInstaller的"hooks"机制

四、参考链接


〇、问题描述

运行打包的exe时出现闪退,查看报错信息:No module named 'openpyxl.cell._writer'

一、exe闪退如何查看报错信息

在控制台中运行exe程序,即可看到报错信息

二、解决No module named 'xxx'

 PyInstaller有时无法正确找到所有的依赖文件,便会出现No module named 'xxx'的问题,可以使用PyInstaller的"hooks"机制来解决在打包应用程序时可能出现的模块导入问题。在本例中,使用--hidden-import命令最为简单有效,将所缺失的模块添加在后面即可:

pyinstaller -F temp.py --hidden-import openpyxl.cell._writer

若缺失多个模块,可以在xxx.spec打包信息文件中添加模块名,如:hiddenimports=['openpyxl.cell._writer'],注意需要给模块名添加引号

​​​​​xxx.spec打包信息文件

编辑hiddenimports参数

然后使用spec文件重新打包:

Pyinstaller temp.spec

打包完成后即可成功运行exe文件

三、PyInstaller的"hooks"机制

第三小节简单介绍一下PyInstaller的"hooks"机制

PyInstaller的"hooks"机制是一种用于处理在打包应用程序时可能出现的模块导入问题的机制。当应用程序依赖于某些模块时,PyInstaller 需要确保这些模块在打包后的可执行文件中得到正确包含。

以下是PyInstaller hooks机制的基本原理:

  1. 导入分析:

    PyInstaller首先会对Python脚本进行分析,识别出所有的导入语句。这包括标准库模块、第三方库和你自己的模块。
  2. 自动生成Hooks:

    对于标准库和许多常见的第三方库,PyInstaller内置了一些默认的hooks规则,用于处理这些库的导入。这些规则存储在PyInstaller的安装目录中。
  3. Hooks文件:

    对于不被PyInstaller默认识别的库或一些需要特殊处理的情况,用户可以自定义hooks。这些hooks是一些Python脚本,命名为hook-*.py,其中*是库或模块的名称。这些hooks文件包含规则,告诉PyInstaller如何处理特定的导入语句。
  4. hiddenimports属性:

    hooks文件中通常包含hiddenimports属性,该属性指定在特定导入语句中可能需要额外导入的模块。这些模块在打包时将被包含到生成的可执行文件中。
  5. --additional-hooks-dir选项:

    用户可以通过使用PyInstaller的--additional-hooks-dir选项,指定一个目录,其中包含额外的hooks文件。这对于将用户自定义的hooks与源代码分开存放非常有用。

通过这个机制,PyInstaller能够在构建应用程序时检测到导入的模块,确保这些模块的依赖关系在打包后的可执行文件中得到正确处理。这有助于解决因为特定的导入语句而导致的在运行时找不到模块的问题。 

因此,当依赖项出现问题时,可以尝试两种主要方法来解决:

使用hook文件:

  • 创建一个包含hiddenimports规则的hook文件,以告诉PyInstaller在特定导入语句中需要额外导入哪些模块。
  • 使用hook文件是一种更灵活和细粒度的方法。用户可以创建包含特定导入规则的hook文件,告诉PyInstaller如何处理特定库或模块的导入。这些hook文件的命名通常是hook-*.py,其中*是库或模块的名称。
  • Hook文件中通常包含hiddenimports属性,该属性列出了在特定导入语句中可能需要额外导入的模块。这样,PyInstaller在构建时会自动包含这些模块。

使用--hidden-import:

  • 直接在PyInstaller命令行中使用--hidden-import选项,以指定需要在应用程序中隐藏导入的模块。
  • --hidden-import选项是一种在命令行中直接指定需要在应用程序中隐藏导入的模块的方法。这是一种更简单、直接的方法,适用于一次性或调试的目的。可以在PyInstaller命令行中多次使用该选项,以指定多个需要隐藏导入的模块。
  • 与使用hook文件不同,--hidden-import选项不提供像hiddenimports属性那样的细粒度控制,而是直接告诉PyInstaller在构建时包含指定的模块。

两者都是为了解决在打包应用程序时可能出现的导入问题而设计的,用户可以根据具体需求选择使用hook文件、--hidden-import选项或两者结合使用。使用hook文件的主要优势在于更灵活的配置和细粒度的控制,而--hidden-import选项则更为直接和简单。

四、参考链接

  1. python - How to properly create a pyinstaller hook, or maybe hidden import? - Stack Overflow
  2. python - How to solve ModuleNotFoundError: No module named 'openpyxl.cell._writer'? - Stack Overflow
  3. Understanding PyInstaller Hooks — PyInstaller 6.3.0 documentation
  4. [转]pyinstaller打包讲解 -F,-D,-w,-c,以及--hidden-import的用法_pyinstaller -d-CSDN博客
  5. PyInstaller 打包 Python 脚本为 .exe 可执行文件闪退、No Model named XXX问题-腾讯云开发者社区-腾讯云 (tencent.com)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值