ImportError: no se puede importar el nombre '...' de 'colecciones' usando Python 3.10
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)
Cambiar:
from collections import Mapping
a
from collections.abc import Mapping
Esto se debe a un cambio en la collections
interfaz 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 .
Debe importar desde el nuevo abc
módulo interno collections
para 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