
在使用 PyInstaller或auto-py-to-exe(或其他打包软件)打包 Python 程序时,某些依赖模块没有被正确识别或包含进打包后的程序中,启动打包后的 exe 文件,一般会报错误,列如下图的报错:

打包后启动程序,报告的确 XXX模块
Unhandled exception in script
Failed to execute script 'main' due to unhandled exception: No module named 'scipy._cyutility'
Traceback (most recent call last):
File "main.py", line 4, in <module>
File "PyInstallerloaderpyimod02_importers.py", line 457, in exec_module这是在使用 PyInstaller(通过 auto-py-to-exe)打包 Python 程序时,某些依赖模块没有被正确识别或包含进打包后的程序中所导致的典型问题。具体来说,scipy._cyutility 是 scipy 的一个内部 C 扩展模块,在打包过程中未被自动检测到。如果你遇到的是其他模块,大致也是类似情况。
方法一:添加缺失的隐藏导入(Hidden Imports)
scipy._cyutility 属于“隐藏导入”,即 PyInstaller 无法从代码中静态分析出需要导入这个模块,因此不会将其打包进去。
你需要告知 PyInstaller 显式地将它加入打包列表。
1. 在 auto-py-to-exe 中添加 Hidden Import:
打开 auto-py-to-exe。
在 “Advanced PYZ and EXE settings (optional)” 部分找到 "Add additional packages to include" 或 "Additional hidden imports"。
输入以下内容(也可以多行输入多个模块),然后重新打包
scipy._cyutility方法二:手动修改 .spec 文件(适用于高级用户)
如果你是通过生成 .spec 文件来打包的,可以编辑该文件:
# 在 Analysis 阶段添加 hiddenimports
a = Analysis(
...
hiddenimports=['scipy._cyutility', 'scipy.sparse._csparsetools', 'scipy._lib.messagestream'],
...
)然后重新打包。
直接在 py 文件中,显性导入缺少的模块,重新打包即可。如图:

显性导入缺少的模块
最后:有时候,像 tqsdk、pandas、numpy、matplotlib、scipy 这类库会引入许多动态导入和 C 扩展模块,PyInstaller 默认并不会全部包含进来。所以提议你在打包这类项目时,提前准备好一份 hidden import 列表 或者 在 py 文件中把它们都显性导入进来。

你学会了吗?
(汇报完毕,感谢收看!)