ImportError: no se puede importar el nombre '...' de 'colecciones' usando Python 3.10

Resuelto Mitra asked hace 3 años • 12 respuestas

Estoy intentando ejecutar mi programa que utiliza varias dependencias, pero desde que actualicé a Python 3.10 esto ya no funciona. Cuando ejecuto "python3" en la terminal y desde allí importo mis dependencias, aparece un error:

ImportError: cannot import name 'Mapping' from 'collections' (/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/collections/__init__.py)

Esto parece ser un problema general, pero aquí está el rastreo de mi caso específico:

Traceback (most recent call last):
 File "/Users/mk/Flasktut/app.py", line 2, in <module>
  from flask import Flask, render_template
 File "/Users/mk/Flasktut/env/lib/python3.10/site-packages/flask/__init__.py", line 14, in <module>
  from jinja2 import escape
 File "/Users/mk/Flasktut/env/lib/python3.10/site-packages/jinja2/__init__.py", line 33, in <module>
  from jinja2.environment import Environment, Template
 File "/Users/mk/Flasktut/env/lib/python3.10/site-packages/jinja2/environment.py", line 16, in <module>
  from jinja2.defaults import BLOCK_START_STRING, \
 File "/Users/mk/Flasktut/env/lib/python3.10/site-packages/jinja2/defaults.py", line 32, in <module>
  from jinja2.tests import TESTS as DEFAULT_TESTS
 File "/Users/mk/Flasktut/env/lib/python3.10/site-packages/jinja2/tests.py", line 13, in <module>
  from collections import Mapping
ImportError: cannot import name 'Mapping' from 'collections' (/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/collections/__init__.py)
Mitra avatar Sep 30 '21 00:09 Mitra
Aceptado

Cambiar:

from collections import Mapping

a

from collections.abc import Mapping
Geremia avatar Oct 26 '2021 17:10 Geremia

Esto se debe a un cambio en la collectionsinterfaz a partir de Python 3.10. Por lo que puedo ver, hasta ahora hay tres opciones para mitigar este problema:

  • Si el error ocurre en una biblioteca de terceros, intente actualizar esta biblioteca primero ( pip install <package> --upgrade).

  • Vuelva a Python 3.9.

  • Parchea el código manualmente.

    Para parchear ImportError, consulte https://stackoverflow.com/a/69727802/13994294 .

Christoph Thiede avatar Jan 02 '2022 16:01 Christoph Thiede

Debe importar desde el nuevo abcmódulo interno collectionspara versiones posteriores de Python.

Si necesita que su código sea compatible con versiones anteriores de Python, puede usar esto:

try:
    from collections.abc import Mapping
except ImportError:
    from collections import Mapping
Chris Redford avatar Mar 11 '2022 12:03 Chris Redford