解决pyinstaller 打包后运行exe程序出现的"ModuleNotFindError"

作者博客地址:http://www.yooongchun.cn/

在用pyinstaller打包python程序
pyinstaller版本为:3.3.1
python 版本:3.6.1
系统版本:Windows-10-10.0.16299-SP0


我的python程序名为:data_processing_gui.py
程序在python环境下正常运行。
打包使用的格式为:pyinstaller -F -p <导入的包路径> myprogram.py
完整打包命令为:

 pyinstaller -F -p C:\Users\fanyu\Anaconda3\Lib;C:\Users\fanyu\Anaconda3\Lib\site-packages;C:\Users\fanyu\Anaconda3\Lib\site-packages\PyQt5\Qt\bin;C:\Users\fanyu\Anaconda3\Lib\site-packages\pydicom;C:\Users\fanyu\Anaconda3\Lib\site-packages\radiomics;C:\Users\fanyu\Anaconda3\Lib\site-packages\pywt;C:\Users\fanyu\Anaconda3\Lib\site-packages\pywt\_extensions;C:\Users\fanyu\Anaconda3\Lib\site-packages\tensorflow;C:\Users\fanyu\Anaconda3\Lib\site-packages\SimpleITK;C:\Users\fanyu\Anaconda3\Lib\site-packages\PIL;C:\Users\fanyu\Anaconda3\Lib\site-packages\pandas;C:\Users\fanyu\Anaconda3\Lib\site-packages\nrrd;C:\Users\fanyu\Anaconda3\Lib\site-packages\numpy -i C:\Users\fanyu\Desktop\work\package\image\doctor.ico data_processing_gui.py
pause

打包过程无报错,打包完成后运行程序提示出错信息:

 Traceback (most recent call last):
  File "data_processing_gui.py", line 12, in <module>
  File "c:\users\fanyu\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\radiomics\__init__.py", line 15, in <module>
  File "c:\users\fanyu\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\radiomics\imageoperations.py", line 6, in <module>
  File "c:\users\fanyu\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pywt\__init__.py", line 17, in <module>
  File "c:\users\fanyu\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pywt\_functions.py", line 17, in <module>
  File "c:\users\fanyu\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)
  File "pywt/_extensions/_pywt.pyx", line 1, in init pywt._extensions._pywt (pywt\_extensions\_pywt.c:31281)
ModuleNotFoundError: No module named 'pywt._extensions._cwt'
[7564] Failed to execute script data_processing_gui

最后在Stackoverflow上发现了一个类似问题,最终解决了问题
解决方案是:

首先,使用pyinstaller 打包生成".spec" 文件
接下来,使用文本编辑器打开".spec"文件,在 hiddenimport=[] 部分添加缺少的module,我的程序中缺少的是 pywt 模块,因而添加:
hiddenimport=[
"pywt","pywt._extensions._cwt"]
然后使用pyinstaller 生成新的exe程序:
pyinstaller my.spec

最终,问题解决。
这里有Stackoverflow 上我的问题:https://stackoverflow.com/questions/49232117/using-pyinstaller-to-package-python-program-and-there-is-a-nomodulefinderror/49289859#49289859
这里是找到答案的位置:https://stackoverflow.com/questions/47607315/modulenotfounderror-no-module-named-pandas-libs-tslibs-timedeltas

### PyInstaller 打包 EXE 缺少模块解决方案 当使用 PyInstallerPython 脚本打包成可执行文件时,可能会遇到运行 EXE 文件时报 `ModuleNotFoundError` 的错误。这是因为某些动态导入的模块未被 PyInstaller 自动检测到并包含在最终的可执行文件中。 #### 使用 `--hidden-import` 参数 可以通过向 PyInstaller 添加 `--hidden-import` 参数来显式指定需要额外引入的模块[^1]。例如: 如果脚本依赖于 `docx` 模块而 PyInstaller 未能自动识别,则可以这样调用命令: ```bash pyinstaller -F -w your_script.py --hidden-import=docx ``` 此参数的作用是告知 PyInstaller 额外查找特定模块,并将其纳入打包范围。 #### 复杂依赖关系处理 然而,在一些情况下,仅通过 `--hidden-import` 并不足以解决问题,特别是涉及复杂的依赖链(如 DLL 或其他外部资源)。此时可能还需要手动调整打包配置或提供更详细的路径说明[^2]。 ##### 方法一:分析具体缺失内容 利用 `-d all` 开启调试模式重新构建项目,观察日志输出定位确切丢失的部分。之后针对这些部分逐一增加对应的隐藏导入声明或者复制必要的二进制文件至目标目录下。 ##### 方法二:自定义 `.spec` 文件 创建 spec 文件允许更加精细地控制整个打包流程。编辑其中的数据结构字段以加入遗漏项。比如下面的例子展示了如何添加数据文件和附加库支持: ```python a = Analysis(['your_script.py'], pathex=['.'], binaries=[], datas=[('data_folder/*', 'destination_data')], hiddenimports=['missing_module_name'], hookspath=None, runtime_hooks=None, excludes=None, win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None) pyz = PYZ(a.pure, a.zipped_data, cipher=None) exe = EXE(pyz,...) # 其他选项省略显示 coll = COLLECT(exe,...) # 同上 ``` 完成修改后再依据新规格重做编译操作即可。 #### 总结 对于简单的案例可以直接采用命令行形式补充所需的隐含引用;而对于较为棘手的情形则推荐借助高级功能深入定制化设置过程。如此这般便能有效应对因模块遗失所引发的各种异常状况。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoz.cool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值