目录
〇、问题描述
运行打包的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'],注意需要给模块名添加引号


然后使用spec文件重新打包:
Pyinstaller temp.spec
打包完成后即可成功运行exe文件
三、PyInstaller的"hooks"机制
第三小节简单介绍一下PyInstaller的"hooks"机制
PyInstaller的"hooks"机制是一种用于处理在打包应用程序时可能出现的模块导入问题的机制。当应用程序依赖于某些模块时,PyInstaller 需要确保这些模块在打包后的可执行文件中得到正确包含。
以下是PyInstaller hooks机制的基本原理:
-
导入分析:
PyInstaller首先会对Python脚本进行分析,识别出所有的导入语句。这包括标准库模块、第三方库和你自己的模块。 -
自动生成Hooks:
对于标准库和许多常见的第三方库,PyInstaller内置了一些默认的hooks规则,用于处理这些库的导入。这些规则存储在PyInstaller的安装目录中。 -
Hooks文件:
对于不被PyInstaller默认识别的库或一些需要特殊处理的情况,用户可以自定义hooks。这些hooks是一些Python脚本,命名为hook-*.py
,其中*
是库或模块的名称。这些hooks文件包含规则,告诉PyInstaller如何处理特定的导入语句。 -
hiddenimports属性:
hooks文件中通常包含hiddenimports
属性,该属性指定在特定导入语句中可能需要额外导入的模块。这些模块在打包时将被包含到生成的可执行文件中。 -
--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
选项则更为直接和简单。
四、参考链接
- python - How to properly create a pyinstaller hook, or maybe hidden import? - Stack Overflow
- python - How to solve ModuleNotFoundError: No module named 'openpyxl.cell._writer'? - Stack Overflow
- Understanding PyInstaller Hooks — PyInstaller 6.3.0 documentation
- [转]pyinstaller打包讲解 -F,-D,-w,-c,以及--hidden-import的用法_pyinstaller -d-优快云博客
- PyInstaller 打包 Python 脚本为 .exe 可执行文件闪退、No Model named XXX问题-腾讯云开发者社区-腾讯云 (tencent.com)