ModuleNotFoundError是ImportError的子类,专用于Python 3.6+中“模块未找到”的场景;Python 2及早期3.x版本统一用ImportError覆盖所有导入失败情况。

Python 3 报 ModuleNotFoundError,Python 2 报 ImportError 是版本差异导致的
这不是 bug,而是 Python 3.6+ 明确拆分了导入失败的错误类型:ModuleNotFoundError 是 ImportError 的子类,专用于“模块根本找不到”这一场景;而 Python 2 和早期 Python 3 中,所有导入失败(包括拼错名、路径不对、依赖缺失)都统一抛 ImportError。
为什么改?——让错误更可诊断
原来一个 ImportError 可能掩盖多种问题:是包没装?路径错了?还是循环导入?还是语法错误?Python 3 引入 ModuleNotFoundError 后,你一眼就能判断——解释器连模块文件都没搜到,不用先去查代码逻辑。
- 遇到
ModuleNotFoundError: No module named 'requests'→ 先查pip list,再确认是否在正确环境里运行 - 遇到
ImportError: cannot import name 'foo'→ 模块找到了,但里面没定义foo,可能是拼写、版本不兼容或条件导入失败 - Python 2 下只有
ImportError,必须靠错误消息后半句(如no module named)手动区分,容易误判
兼容写法:捕获导入失败时别只抓 ImportError
如果你的代码要同时支持 Python 2 和 Python 3,又想统一处理“模块缺失”,得同时捕获两个异常:
try:
import requests
except (ImportError, ModuleNotFoundError):
print("requests 未安装或不可用")
但注意:这种写法在 Python 2 下 ModuleNotFoundError 会报 NameError(因为不存在),所以更稳妥的是只捕获 ImportError,或用 sys.version_info 分支判断。
立即学习“Python免费学习笔记(深入)”;
实际排查时最容易忽略的一点
很多人看到 ModuleNotFoundError 就立刻去 pip install,却忘了检查当前 Python 解释器是不是自己以为的那个——which python、python -m pip install、pip --version 这三者输出不一致,才是真凶。尤其在多版本共存、IDE 自带解释器、WSL 环境下,pip install 很可能装到了另一个 Python 实例的 site-packages 里。


















