PyInstaller打包报module 'itk' has no attribute错误求助
报错原因
两个AttributeError的核心诱因是PyInstaller默认打包逻辑未完整收录ITK的运行时资源:
ITK的Image、GDCMSeriesFileNames等核心接口不是在顶层itk模块初始化时直接声明的,而是运行时通过懒加载机制从各子模块动态挂载,单纯调用collect_submodules('itk')仅能收集到显式导入的子模块,会遗漏懒加载模块、配套动态链接库、ITK自身的配置数据,最终导致运行时找不到对应属性。
修复步骤
- 先升级打包环境的PyInstaller钩子库到最新版,执行命令
pip install -U pyinstaller-hooks-contrib,最新版官方钩子已经包含ITK的基础适配逻辑,无需手动枚举上百个ITK子模块。 - 修改spec文件,除了收集子模块外,额外把ITK的所有数据文件、动态链接库纳入打包范围。
- 配置UPX排除规则,禁止UPX压缩ITK相关二进制文件,UPX压缩会破坏ITK动态库的符号表,触发属性缺失报错。
修正后的spec配置
from PyInstaller.utils.hooks import collect_submodules, collect_data_files, collect_dynamic_libs hiddenimports = [] hiddenimports += collect_submodules('vtkmodules') hiddenimports += collect_submodules('pydicom') hiddenimports += collect_submodules('itk') # 补充收集ITK的静态资源和动态库 datas = collect_data_files('itk') binaries = collect_dynamic_libs('itk') block_cipher = None a = Analysis( ['app.py'], pathex=[], binaries=binaries, datas=datas, hiddenimports=hiddenimports, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='app', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=['itk*'], console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=['itk*'], name='app', )
配置修改完成后,执行pyinstaller 对应spec文件名.spec重新打包即可,生成的可执行文件不会再出现这两个属性缺失报错。如果运行时提示个别ITK子模块不存在,直接把缺失的模块名追加到hiddenimports列表即可。
内容的提问来源于stack exchange,提问作者Javier Reyero Huerga
相关产品推荐
相关产品推荐

