Python3.8:ImportError 和 ModuleNotFoundError 有什么区别

问题描述 投票:0回答:3

在python3.8中,

ImportError
ModuleNotFoundError
有什么区别?我只是想知道有什么区别以及它们为什么重要。

python python-3.x python-import
3个回答
14
投票

ModuleNotFoundError
ImportError
种类
:

>>> issubclass(ModuleNotFoundError, ImportError)
True

当根本找不到模块时会专门引发该问题。找到文件后,但在加载文件或定义函数的实际过程中,可能会出现其他问题:这些问题会引发

ImportError

对于 ModuleNotFoundError,您可能

无能为力;您可以忽略它并且不使用稍后在代码中尝试导入的模块,或者退出并修复您的环境,以便找到该模块。

根据Python文档:

6
投票

当导入语句出现问题时,会引发 ImportError 成功导入指定模块。通常,出现这样的问题 由于路径无效或不正确,这将引发 Python 3.6 及更高版本中的 ModuleNotFoundError。

TL;DR 您应该捕获

0
投票
来检测软件包何时未安装。

仅当未找到具有该名称的模块时才会引发

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)


© www.soinside.com 2019 - 2024. All rights reserved.