用 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',如何解决?

3 回复

这个错误通常是因为 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'],
)

关键点

  1. 'packages' 里加上 'itk'
  2. 'includes' 里明确包含 itk 的核心 Python 模块(名称通常以 itk.ITK 开头)。你可以先尝试只加 'itk.ITKCommonBasePython''itk.ITKPythonBase',如果还报错,再根据错误信息添加你代码里用到的具体模块。
  3. 运行打包命令前,确保在终端里用 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’

帮楼主左下格式化

回到顶部