用 py2app 打包 Python 项目时,总是报错:module 'itk' has no attribute 'Image',如何解决?
Traceback (most recent call last): File "/Users/admin/Developer/dist/launcher.app/Contents/Resources/boot.py", line 103, in <module> _run() File "/Users/admin/Developer/dist/launcher.app/Contents/Resources/boot.py", line 82, in _run exec(compile(source, path, 'exec'), globals(), globals()) File "/Users/admin/Developer/dist/launcher.app/Contents/Resources/launcher.py", line 21, in <module> from app.main import begin File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "app/main.pyc", line 16, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "app/defs/init.pyc", line 1, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "app/defs/defs.pyc", line 5, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "bmutils/utils.pyc", line 25, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "bmutils/insighttoolkit/init.pyc", line 1, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "bmutils/insighttoolkit/utils.pyc", line 5, in <module> File "<frozen importlib._bootstrap="">", line 971, in _find_and_load File "<frozen importlib._bootstrap="">", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap="">", line 656, in _load_unlocked File "<frozen importlib._bootstrap="">", line 626, in _load_backward_compatible File "bmutils/insighttoolkit/defs.pyc", line 3, in <module> File "bmutils/insighttoolkit/defs.pyc", line 4, in ItkTypes File "itkLazy.pyc", line 40, in getattribute AttributeError: module 'itk' has no attribute 'Image'</module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></frozen></frozen></frozen></frozen></module></module>
用 py2app 打包 Python 项目时,总是报错:module 'itk' has no attribute 'Image',如何解决?
这个错误通常是因为 py2app 在打包时没有正确包含 itk 的 C++ 扩展模块。itk 依赖很多动态链接库,py2app 默认的依赖分析可能漏掉它们。
解决方案:在 setup.py 中明确告诉 py2app 包含 itk 的完整包数据。下面是一个可用的 setup.py 配置示例:
from setuptools import setup
APP = ['your_main_script.py'] # 替换为你的主脚本文件名
DATA_FILES = []
OPTIONS = {
'argv_emulation': False,
'packages': ['itk'], # 明确包含 itk 包
'includes': [
'itk.ITKCommonBasePython',
'itk.ITKPythonBase',
# 根据你实际使用的 ITK 模块添加,例如:
# 'itk.ITKImageFilterBase',
# 'itk.ITKThresholding',
],
'excludes': [],
'iconfile': 'app.icns', # 可选,应用图标
'plist': {
'CFBundleName': 'YourAppName',
}
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
关键点:
- 在
'packages'里加上'itk'。 - 在
'includes'里明确包含itk的核心 Python 模块(名称通常以itk.ITK开头)。你可以先尝试只加'itk.ITKCommonBasePython'和'itk.ITKPythonBase',如果还报错,再根据错误信息添加你代码里用到的具体模块。 - 运行打包命令前,确保在终端里用
pip show itk确认itk包已正确安装。
打包命令:
python setup.py py2app
如果还不行,可以尝试先清理再打包:
rm -rf build dist
python setup.py py2app
总结:手动指定包含 itk 的核心模块。
Traceback (most recent call last):
File “/Users/admin/Developer/dist/launcher.app/Contents/Resources/boot.py”, line 103,
in <module> _run()
File “/Users/admin/Developer/dist/launcher.app/Contents/Resources/boot.py”, line 82,
in _run exec(compile(source, path, ‘exec’), globals(), globals())
File “/Users/admin/Developer/dist/launcher.app/Contents/Resources/launcher.py”, line 21,
in <module> from app.main import begin
File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load
File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked
File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “app/main.pyc”, line 16,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “app/defs/init.pyc”, line 1,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “app/defs/defs.pyc”, line 5,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “bmutils/utils.pyc”, line 25,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “bmutils/insighttoolkit/init.pyc”, line 1,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “bmutils/insighttoolkit/utils.pyc”, line 5,
in <module> File “<frozen importlib._bootstrap=”">", line 971,
in _find_and_load File “<frozen importlib._bootstrap=”">", line 955,
in _find_and_load_unlocked File “<frozen importlib._bootstrap=”">", line 656,
in _load_unlocked File “<frozen importlib._bootstrap=”">", line 626,
in _load_backward_compatible File “bmutils/insighttoolkit/defs.pyc”, line 3,
in <module> File “bmutils/insighttoolkit/defs.pyc”, line 4,
in ItkTypes File “itkLazy.pyc”, line 40,
in getattribute AttributeError: module ‘itk’ has no attribute ‘Image’


