簡體   English   中英

導入錯誤:無法從“importlib”導入名稱“元數據”

[英]ImportError: cannot import name 'metadata' from 'importlib'

在蟒蛇( Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 )會話下,在 Anaconda 提示符下啟動,我得到錯誤

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

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


編輯 1 :我現在可以消除錯誤。 有一個更改可以做到這一點:刪除PYTHONPATH環境變量中導致OSError: [WinError 123] ... after >>> import nbconvert 刪除/添加該字符串,刪除/恢復錯誤。

我不確定我在激活的 virtualenv(我有 python 3.8.0)中做了conda install nbconvert的事實是否也起作用了; 在此安裝之前我沒有測試。

更重要的是,我無法弄清楚OSErrorfrom 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
>>>

該問題是由庫 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

要解決此問題,您必須將 jsonschema 包降級到更改之前的版本:

pip 安裝 jsonschema==3.0.2

今天,我遇到了與您類似(但不完全相同)的錯誤。

從 Python 3.8 開始, importlib模塊有一個metadata子模塊。 對於在較舊 Python 版本下運行的庫,庫importlib_metadata已被用於復制行為。 例如, jsonschema庫(由 Jupyter notebooks 使用),使用如下:

# __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']
>>>

啟動 jyputer 筆記本時,我遇到了同樣的 json 模式問題。 事實上,這個問題是由於 jsonschema 中的最新更新造成的。 通過將 jsonshema 降級到 3.0.2,錯誤ImportError: cannot import name 'metadata' from 'importlib ' 解決了,最后 jyputer notebook 和 jyputer lab 啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM