在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
>>>
答案 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