【问题标题】:ImportError: cannot import name 'metadata' from 'importlib'ImportError:无法从“importlib”导入名称“元数据”
【发布时间】:2019-12-06 15:39:42
【问题描述】:

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

>>> 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)

实际上,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']

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


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

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

更重要的是,我无法弄清楚OSError存在一条线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
>>>

【问题讨论】:

  • @jonrsharpe - 见编辑过的 OP。 1) 我无法弄清楚为什么在importlib 没有metadata 的分布中存在from importlib import metadata 行。它显然会失败。 2) 我有一个带有 python 3.8.0 的 virtualenv。完全一样的事情发生了,这更奇怪。 3)奇怪的是(对我来说)删除PYTHONPATH中的一个麻烦的字符串会删除错误(尽管它没有回答上面的两个问题)。

标签: python importerror python-importlib


【解决方案1】:

此问题是由库 jsonschema 的最近更改引起的。查看https://github.com/Julian/jsonschema/blob/master/jsonschema/init.py,您会看到 2019 年 9 月 26 日发生了变化,将 pkg_resources 更改为 importlib_metadata 作为 Python

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

pipenv install jsonschema==3.0.2

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

【讨论】:

  • 谢谢,完美运行。如果你在 Anaconda 中,可以在“环境”中搜索包,右键单击,选择“标记为特定版本安装”,然后选择 3.0.2。
【解决方案2】:

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

从 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")

要回答您的第一个问题,错误的原因很可能是由于您使用的已安装库的版本不匹配。这可能是手动安装 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']
>>>

【讨论】:

    【解决方案3】:

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

    pip install jsonschema==3.0.2

    【讨论】:

    • 问题仍然存在。在切换到 3.0.2 时没有得到解决。有什么原因吗?
    【解决方案4】:

    我在启动 jyputer 笔记本时遇到了同样的 json 架构问题。事实上,这个问题是由于 jsonschema 中的最新更新造成的。通过将 jsonshema 降级到 3.0.2,错误 ImportError: cannot import name 'metadata' from 'importlib' 得到解决,最终 jyputer notebook 和 jyputer lab 启动。

    【讨论】:

      【解决方案5】:

      进展如何?

      我使用代码修复了这个错误:

      conda install -c anaconda importlib-metadata
      

      我从这里得到它:codenong

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-24
        • 1970-01-01
        • 2022-01-22
        • 2021-06-30
        • 2020-10-19
        • 2018-08-13
        • 2015-01-26
        • 2020-10-10
        相关资源
        最近更新 更多