Python 3.8:ImportError和ModuleNotFoundError有什么区别

xwbd5t1u  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(101)

Python 3.8中ImportErrorModuleNotFoundError有什么区别?我只是想知道有什么区别,为什么它们很重要。

gev0vcfq

gev0vcfq1#

ModuleNotFoundErrorImportError的一种:

>>> issubclass(ModuleNotFoundError, ImportError)
True

它是专门在完全找不到模块时引发的。其他问题可能发生在找到文件之后,但在加载文件或定义函数的实际过程中:这将提高ImportError
对于ModuleNotFoundError,你可能做不了什么;你可以忽略它,不使用你试图在代码后面导入的模块,或者退出并修复你的环境,这样模块就能被找到。

xsuvu9jc

xsuvu9jc2#

根据Python文档:
当import语句在成功导入指定模块时遇到问题时,将引发ImportError。通常,这样的问题是由于无效或不正确的路径,这将在Python 3.6和更新版本中引发ModuleNotFoundError。

nom7f22z

nom7f22z3#

TL;DR您应该捕获ModuleNotFoundError以检测软件包何时未安装。
ModuleNotFoundError只有在没有找到该名称的模块时才会引发,通常是因为没有安装包。它是在python 3.6+中引入的,是ImportError的子类。
ImportError在模块导入失败时引发,原因有一百万种。
主要用例是检测何时安装了可选库以启用其他功能。例如,一个数据科学工具可以支持导出到excel文件,但只有在安装了excel库(xlsxwriter或openpyxl)的情况下。
应用程序可以检测JIT库(cython,numba),加密库,压缩库(lz 4,zstd,snappy,brotli),导出格式(csv,excel,openXML)。
您应该捕获ModuleNotFoundError以检测软件包何时未安装。
如果你捕获的是ImportError而不是ModuleNotFoundError,你可能会默默地捕获并丢弃真正的错误,比如模块有bug,或者在那个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)

相关问题