PyInstaller打包的exe执行报错:skimage导入引发ValueError(存根文件缺失)
解决PyInstaller打包scikit-image时的存根文件缺失问题
问题根源
scikit-image依赖lazy_loader实现模块延迟加载,PyInstaller默认未正确收集lazy_loader模块,也未打包skimage所需的.pyi存根文件,导致运行时触发文件找不到的错误。
分步解决方案
1. 补充缺失的隐藏导入
直接在打包命令中添加lazy_loader的隐藏导入,同时保留skimage相关的导入配置,修改后的命令如下:
pyinstaller name.py --debug=all -c --icon=icon.png --onefile --hidden-import=skimage --hidden-import=skimage.metrics --hidden-import=lazy_loader
2. 完善自定义Hook文件
若第一步无效,重新编写更完整的hook-skimage.py,确保收集所有存根文件并强制导入依赖模块:
from PyInstaller.utils.hooks import collect_data_files # 收集skimage目录下所有的.pyi存根文件 datas = collect_data_files('skimage', includes=['**/*.pyi']) # 强制将lazy_loader加入隐藏导入列表 hiddenimports = ['lazy_loader']
将该文件放入单独的文件夹(比如./hooks),打包时指定hooks目录:
pyinstaller name.py --debug=all -c --icon=icon.png --onefile --additional-hooks-dir=./hooks
3. 手动复制存根文件(应急方案)
如果Hook方案仍不生效,找到Python环境中skimage的安装路径(通常在Lib/site-packages/skimage),将所有.pyi文件复制到exe所在目录下新建的skimage文件夹中,运行exe时会自动读取该目录的文件。
4. 降级scikit-image版本(可选)
新版本scikit-image的延迟加载逻辑可能与PyInstaller存在兼容性问题,可尝试降级到0.19.3版本:
pip install scikit-image==0.19.3
重新打包后测试运行效果。
内容的提问来源于stack exchange,提问作者MrSpexxx
相关产品推荐
相关产品推荐

