web-dev-qa-db-fra.com

ImporterRor: Impossible d'importer le nom 'Metadata' de 'ImportLib'

Sous A python (Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32) Séance lancée dans une invite Anaconda, je reçois l'erreur

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

Efficacement, metadata n'est pas dans 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']

Ceci est la seule référence que j'ai trouvée, mentionnant qu'il a été observé Dans certains cas (bizarre?) In python 3.8.


Edition 1 : Je suis maintenant capable de supprimer l'erreur. Il y a un changement qui fait cela: retirer une chaîne dans la variable d'environnement PYTHONPATH qui a conduit à un OSError: [WinError 123] ... après >>> import nbconvert. Supprimer/ajouter cette chaîne, supprime/rétablit l'erreur.

Je ne suis pas certain si le fait que j'ai fait conda install nbconvert Dans un virtualv activé (où j'ai python 3.8.0) a également joué un rôle; Je n'ai pas testé avant cette installation.

Plus important encore, je ne peux pas comprendre la connexion entre la présence OSError et la d'une ligne from importlib import metadata.


Edit 2 : J'ai un virtualenv avec python 3.8.0, où importlib n'a pas metadata non plus. Donc, je ne peux toujours pas comprendre pourquoi la présence d'une ligne 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
>>>

Pour résoudre le problème, vous devez rétrograder votre package JSONSCHEMA à une version qui pree le changement:

pIP INSTALLATION JSONSCHEMA == 3.0.2

1
sajid

J'ai eu le même numéro de Schema JSON lors de la lancement du cahier JJYTER. En effet, cette question est due à la dernière mise à jour de Jsonschema. En descendant le jsonshema à 3.0.2 l'erreur ImportError: cannot import name 'metadata' from 'importlib 'Résolu et finalement le carnet de notes JYPUTER et JYPUTER LAB lancé.

0
Bilal Chandio

Aujourd'hui, j'ai rencontré une erreur similaire (mais pas exactement la même) à la vôtre.

À partir de Python 3.8, le module importlib a une sous-module metadata. Pour les bibliothèques fonctionnant sous Animary Python Versions, le Bibliothèque importlib_metadata a été faite pour reproduire le comportement. Par exemple, la bibliothèque jsonschema (utilisé par Jupyter Notebooks), l'utilise comme suit:

# __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")

Pour répondre à votre première question, la cause de l'erreur est probablement due à une inadéquation dans les versions des bibliothèques installées que vous utilisiez. Cela pourrait résulter d'une installation manuelle du PIP ou d'autres bibliothèques ne permettant pas de répertorier des versions de dépendance appropriées.

Votre deuxième question (modifier 1): importation nbconvert déclenche l'importation de jsonschema, qui conduira à la même erreur.

Vous mentionnez également une OsError, mais ne donnez aucun détail lorsque/comment cela s'est produit. Dans mon problème d'origine (comment j'ai trouvé votre question), j'ai trouvé que la bibliothèque importlib_metadata pourrait lancer une OsError lorsque certains dossiers d'utilisateur ne sont pas accessibles en raison des autorisations. Ils ont corrigé cela dans la version 1.4.

Votre dernière question (modifier 2): vous utilisez dir(), qui répertorie les attributs de importlib, cependant, importlib.metadata est un module valide qui n'est tout simplement pas répertorié comme un attribut. Il peut être importé dans 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']
>>>
0
DieterDP