目录
Python 3.12 下运行 OpenMMLab 的 MIM 工具报错的原因与解决方案
Python 3.12 下运行 OpenMMLab 的 MIM 工具报错的原因与解决方案
近期在使用 Python 3.12 环境安装并运行 OpenMMLab 的 mim
工具时遇到了 pkgutil.ImpImporter
的兼容性报错。本文将深入分析该错误产生的原因,并提供一套可靠的解决方案,包括推荐的 Python 版本切换方式,帮助开发者顺利使用 OpenMMLab 工具链。
背景介绍
OpenMMLab 提供了强大的模型安装工具 —— mim
(Model Installer Manager),可以快速安装如 mmengine
、mmsegmentation
等模块。但当我们使用 Python 3.12 环境运行如下命令:
mim install mmengine
却报出如下错误:
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
这让很多用户感到困惑,下面我们一步一步剖析这个问题的根源,并提供可行的解决方案。
错误分析
从报错堆栈可以看到,mim
工具在初始化时依赖了 setuptools
,进而调用了 pkg_resources
模块,而 pkg_resources
又使用了如下这段代码:
register_finder(pkgutil.ImpImporter, find_on_path)
然而从 Python 3.12 开始,pkgutil.ImpImporter
被彻底移除(对应的 PEP 594,废弃老旧 API),导致上述语句运行失败。
🔥 根本原因:
-
pkg_resources
尚未兼容 Python 3.12; -
OpenMMLab 的
mim
工具间接依赖了pkg_resources
; -
Python 3.12 不再支持
pkgutil.ImpImporter
,引发AttributeError
。
推荐解决方案:降级 Python 版本
目前,最稳妥的解决办法是使用 Python 3.10 或 3.11 来运行 mim 工具和 OpenMMLab 生态。
步骤如下:
-
创建新的 Conda 环境
conda create -n mim-env python=3.10 -y
conda activate mim-env
-
安装 openmim 和目标包
pip install openmim
mim install mmengine
-
验证安装是否成功
python -c "import mmengine; print(mmengine.__version__)"
不推荐的临时方案(仅供参考)
有些用户尝试通过 monkey-patch 的方式绕过错误:
import pkgutil
pkgutil.ImpImporter = None
虽然这能消除当前的报错,但会造成其他包运行失败,属于不安全行为。不推荐在生产环境中使用。
总结
Python 3.12 的一些变更对老旧模块兼容性影响较大,特别是一些尚未更新到最新依赖的第三方工具。若你需要使用 OpenMMLab 提供的 mim
安装器,建议在 Python 3.10 或 3.11 环境下运行,这是目前最稳妥的方式。
随着社区更新,未来 pkg_resources
可能会移除对 ImpImporter
的依赖,届时 Python 3.12 才能完全兼容这些工具。
附:参考资源
-
Python 官方 PEP 594
-
OpenMMLab 官网:https://openmmlab.com
-
mim 工具文档:GitHub - open-mmlab/mim: MIM Installs OpenMMLab Packages