#Что означает ошибка
cannot import name
ImportError: cannot import name не всегда означает цикл. Сообщение from partially initialized module обычно указывает на незавершённую инициализацию из-за взаимного импорта; без него сначала проверяют существование символа, версию библиотеки и совпадение имён файлов.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Циклический импорт | В трассировке «partially initialized module», файлы импортируют друг друга | Вынести общий код в независимый модуль |
| Опечатка имени | Импортируемого имени нет в модуле или ошибочен регистр | Сверить определение и написание имени |
| Имя файла совпадает | Импорт разрешается в локальный json.py или typing.py | Переименовать конфликтующий файл проекта |
| Старая версия | Символ отсутствует в данной версии пакета | Проверить API и версию пакета |
#Пошаговое решение
- Найдите два модуля, образующих циклВ терминале редактора проекта запустите приложение тем же способом, что и при сбое:
python main.py(в Windows при необходимостиpy main.py). В полной трассировке найдите две строкиFile ...с вашими файлами и сообщениеpartially initialized module— это типичный признак цикла. Откройте оба файла: еслиa.pyна верхнем уровне импортируетb, аb.pyимпортируетa, оба файла зависят друг от друга до окончания инициализации. Сначала сохраните изменения в системе контроля версий. - Разорвите цикл без изменения поведенияВ редакторе выделите общие классы, константы или функции, которыми пользуются оба модуля. Создайте третий файл, например
common.py, поместите определения туда и измените импорты обоих модулей наfrom common import .... Убедитесь, что самcommon.pyне импортируетaиb. Если зависимость нужна лишь во время вызова, допустимо перенести один импорт внутрь соответствующей функции; делайте это только если не создаётся новый круг вызовов. - Исключите опечатку и затенение библиотекиЕсли сообщения
partially initialized moduleнет, посмотрите имя послеcannot import nameи проверьте, действительно ли символ объявлен в указанном модуле и доступен в установленной версии пакета. В терминале проекта выполнитеpython -c "import имя_модуля; print(имя_модуля.__file__)", предварительно заменив имя без кавычек своим. Если путь указывает на вашjson.py,typing.pyили иной файл с именем библиотеки, переименуйте его и перезапустите интерпретатор; не удаляйте системные модули. - Повторите запуск и проверьте точный импортСнова запустите исходную команду и проверьте, что
ImportErrorисчез и основные функции приложения продолжают работать. Если ошибка сменилась, соберите полную трассировку, список файлов с импортами и версииpython --versionи пакета. Не устанавливайте пакеты наугад: проблема циклического импорта находится в структуре программы, а не обязательно в окружении.
#Если проблема осталась
Если «Python: ImportError: cannot import name — циклический импорт» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.