在python3.8中,
ImportError
和ModuleNotFoundError
有什么区别?我只是想知道有什么区别以及它们为什么重要。
ModuleNotFoundError
是ImportError
的种类:
>>> issubclass(ModuleNotFoundError, ImportError)
True
当根本找不到模块时会专门引发该问题。找到文件后,但在加载文件或定义函数的实际过程中,可能会出现其他问题:这些问题会引发
ImportError
。
对于 ModuleNotFoundError
,您可能
无能为力;您可以忽略它并且不使用稍后在代码中尝试导入的模块,或者退出并修复您的环境,以便找到该模块。根据Python文档:
当导入语句出现问题时,会引发 ImportError 成功导入指定模块。通常,出现这样的问题 由于路径无效或不正确,这将引发 Python 3.6 及更高版本中的 ModuleNotFoundError。
TL;DR 您应该捕获
仅当未找到具有该名称的模块时才会引发
ModuleNotFoundError
,通常是因为未安装该软件包。它是在 python 3.6+ 中引入的,是 ImportError
的子类。当模块由于一百万个原因之一而无法导入时,会引发
ImportError
。
主要用例是检测何时安装可选库以启用附加功能。例如,数据科学工具可以支持导出到 Excel 文件,但前提是安装了 Excel 库(xlsxwriter 或 openpyxl)。应用程序可以检测 JIT 库(cython、numba)、加密库、压缩库(lz4、zstd、snappy、brotli)、导出格式(csv、excel、openXML)。
您应该捕获
ModuleNotFoundError
如果您捕获
ImportError
而不是 ModuleNotFoundError
,您可能会默默地捕获并丢弃真正的错误,例如模块有问题或无法在该 python 版本上工作或包之间的不兼容性,您通常希望查看并修复这些错误。
这是一个显示差异的测试:
# mylibrary.py
def hello():
print("hello")
# myapp.py
try:
from mylibrary import missingvar
except ImportError:
print("caught ImportError")
try:
from mylibrary import missingvar
except ModuleNotFoundError:
print("caught ModuleNotFoundError")
输出:
$ python3 myapp.py
caught ImportError
Traceback (most recent call last):
File "/home/user/myapp.py", line 7, in <module>
from mylibrary import missingvar
ImportError: cannot import name 'missingvar' from 'mylibrary' (/home/user/mylibrary.py)