导入错误:无法从“importlib”导入名称“元数据”

san*_*ica 13 python importerror python-importlib

Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32Anaconda 提示中启动的 python ( ) 会话下,我收到错误

>>> import nbconvert
Traceback (most recent call last):
  File "C:\Users\user1\Anaconda\lib\site-packages\jsonschema\__init__.py", line 31, in <module>
    from importlib import metadata
ImportError: cannot import name 'metadata' from 'importlib' (C:\Users\user1\Anaconda\lib\importlib\__init__.py)
Run Code Online (Sandbox Code Playgroud)

有效地,metadata不在importlib

>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings']
Run Code Online (Sandbox Code Playgroud)

是我找到的唯一参考,提到在 python 3.8中的某些情况下(奇怪?)观察到它。


编辑 1:我现在可以消除错误。有一个更改可以做到这一点:删除PYTHONPATH环境变量中导致OSError: [WinError 123] ...after的字符串>>> import nbconvert。删除/添加该字符串,删除/恢复错误。

我不确定我conda install nbconvert在激活的 virtualenv(我有 python 3.8.0)中所做的事实是否也起作用;在此安装之前我没有测试。

更重要的是,我无法弄清楚lineOSError存在from importlib import metadata之间的联系。


编辑 2:我有一个带有 python 3.8.0 的 virtualenv,其中importlib没有metadata。所以我仍然无法弄清楚为什么会出现一行from importlib import metadata

C:\> conda activate opencv
C:\> conda list
...
importlib_metadata        1.1.0                    py38_0    defaults
...
nbconvert                 5.6.1                    py38_0    defaults
...
C:\> python
Python 3.8.0 (default, Nov  6 2019, 16:00:02) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_pack_uint32', '_unpack_uint32', 'find_loader', 'import_module', 'invalidate_caches', 'reload', 'sys', 'types', 'warnings']
>>> import nbconvert
>>>
Run Code Online (Sandbox Code Playgroud)

Jan*_*mbi 14

该问题是由库 jsonschema 中的最近更改引起的。查看https://github.com/Julian/jsonschema/blob/master/jsonschema/init.py,您会看到 2019 年 9 月 26 日发生了变化,将 pkg_resources 更改为 importlib_metadata 作为 Python <3.8 的后备。但是,这似乎不是开箱即用的。

要解决此问题,您必须将 jsonschema 包降级到更改之前的版本:

pipenv install jsonschema==3.0.2
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到:https : //blog.gaborschulz.com/my-jupyter-notebook-stopped-working.html

  • 谢谢,工作完美。如果您使用的是 Anaconda,您可以在“环境”中搜索该软件包,右键单击,选择“标记为特定版本安装”,然后选择 3.0.2。 (2认同)

Die*_*rDP 11

今天,我遇到了与您类似(但不完全相同)的错误。

从Python 3.8开始,importlib模块有一个metadata子模块。对于在较旧的 Python 版本下运行的库,该库importlib_metadata已被用来复制该行为。例如,该jsonschema库(由 Jupyter 笔记本使用)的使用方式如下:

# __init__.py from jsonschema 3.2.0
try:
    from importlib import metadata
except ImportError: # for Python<3.8
    import importlib_metadata as metadata
__version__ = metadata.version("jsonschema")
Run Code Online (Sandbox Code Playgroud)

要回答您的第一个问题,错误的原因很可能是由于您使用的已安装库的版本不匹配。这可能是由于手动 pip 安装或其他库未能列出正确的依赖项版本造成的。

您的第二个问题(编辑1):导入nbconvert会触发 的导入jsonschema,这将导致相同的错误。

您还提到了 OSError,但没有提供它发生的时间/方式的任何详细信息。在我原来的问题(我如何找到你的问题)中,我发现importlib_metadata当某些用户文件夹由于权限而无法访问时,库可能会抛出 OSError 。他们在 1.4 版本中修复了这个问题。

你的最后一个问题(编辑2):你正在使用dir(),它列出了 的属性importlib,但是,importlib.metadata它是一个有效的模块,只是没有被列为属性。可以在python 3.8中导入:

Python 3.8.1 (default, Jan  8 2020, 15:55:49) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> dir('importlib')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> from importlib import metadata
>>> dir(metadata)
['ConfigParser', 'Distribution', 'DistributionFinder', 'EntryPoint', 'FileHash', 'MetaPathFinder', 'MetadataPathFinder', 'PackageNotFoundError', 'PackagePath', 'PathDistribution', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'abc', 'collections', 'csv', 'distribution', 'distributions', 'email', 'entry_points', 'files', 'functools', 'import_module', 'io', 'itertools', 'metadata', 'operator', 'os', 'pathlib', 're', 'requires', 'starmap', 'suppress', 'sys', 'version', 'zipfile']
>>>
Run Code Online (Sandbox Code Playgroud)