ImportError:无法从“ importlib”

时间:2019-12-06 15:39:42

标签: python importerror python-importlib

在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是我发现的唯一参考,提到在某些情况下在 (奇怪吗?)中观察到了它。


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

我不确定我是否在激活的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
>>>

4 个答案:

答案 0 :(得分:8)

此问题是由库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

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

答案 1 :(得分:0)

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

从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']
>>>

答案 2 :(得分:0)

启动jyputer笔记本时,我遇到了相同的json模式问题。确实,此问题归因于jsonschema中的最新更新。通过将jsonshema降级为3.0.2,错误ImportError: cannot import name 'metadata' from 'importlib'得以解决,并最终启动了jyputer笔记本和jyputer实验室。

答案 3 :(得分:0)

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

pip install jsonschema == 3.0.2