ImportError: cannot import name 'ParamSpec' from 'typing_extensions' when using Django websockets with channels and twisted libraries
Мы не обновляли ни одну библиотеку и не добавляли новую. Во время развертывания веб-приложения Django возникла следующая ошибка:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/celery/fixups/django.py", line 118, in django_setup
django.setup()
File "/usr/local/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.7/site-packages/django/apps/registry.py", line 91, in populate
app_config = AppConfig.create(entry)
File "/usr/local/lib/python3.7/site-packages/django/apps/config.py", line 116, in create
mod = import_module(mod_path)
File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/usr/local/lib/python3.7/site-packages/channels/apps.py", line 4, in <module>
import daphne.server
File "/usr/local/lib/python3.7/site-packages/daphne/server.py", line 5, in <module>
from twisted.internet import asyncioreactor # isort:skip
File "/usr/local/lib/python3.7/site-packages/twisted/internet/asyncioreactor.py", line 19, in <module>
from twisted.internet.posixbase import (
File "/usr/local/lib/python3.7/site-packages/twisted/internet/posixbase.py", line 16, in <module>
from twisted.internet import error, tcp, udp
File "/usr/local/lib/python3.7/site-packages/twisted/internet/tcp.py", line 99, in <module>
from twisted.internet import abstract, address, base, error, fdesc, main
File "/usr/local/lib/python3.7/site-packages/twisted/internet/base.py", line 34, in <module>
from twisted.internet import abstract, defer, error, fdesc, main, threads
File "/usr/local/lib/python3.7/site-packages/twisted/internet/defer.py", line 42, in <module>
from typing_extensions import Literal, ParamSpec, Protocol
ImportError: cannot import name 'ParamSpec' from 'typing_extensions' (/usr/local/lib/python3.7/site-packages/typing_extensions.py)
Похоже, это связано с typing_extensions из пакета Python.
Выяснилось, что я не обновил ни одной библиотеки. Но в requirements.txt
в channels
была указана только версия конкретной библиотеки, поэтому при развертывании версия каналов оставалась неизменной. Между тем библиотека twisted является зависимостью третьего уровня и не упоминается напрямую в моем requirements.txt
.
Итак, библиотека twisted
обновилась сама по себе без предупреждения, так как вышла последняя версия 22.10.0. При развертывании она сразу же привела к вышеуказанной ошибке, что заставило нас задуматься о том, кто ее обновил.
В конце концов, мы взяли все библиотеки с помощью pip freeze
из стабильно работающего Docker-контейнера (виртуального env, в вашем случае) и добавили все необходимые зависимости в requirements.txt
. Это позволит избежать неожиданного обновления библиотек, происходящего тихо в фоновом режиме.