Импорт пакета с верхнего уровня приложения

#python #import #importerror

#python #импорт #ошибка импорта

Вопрос:

Итак, у меня есть приложение со структурой:

 main.py
core/__init__.py
core/user_interface.py
core/util/__init__.py
core/util/widgets/__init__.py
core/util/widgets/tab.py
  

The main.py файл выполняет импорт:

 from core import user_interface
  

Это выполняется успешно, затем user_interface выполняет вызов import:

 import core.util.widgets.tab
  

Файл tab.py затем выполняется вызов импорта:

 from core import user_interface
  

Этот последний импорт завершается ошибкой и возвращает ошибку:

 ImportError: cannot import name user_interface
  

Выполнение приложения или попытки импортировать модуль user_interface из терминала завершаются ошибкой, поскольку цепочка импорта прерывается. Я знаю, что где-то я совершаю очень элементарную ошибку, но я почти на пределе своих возможностей с этим. Если кто-нибудь может помочь решить эту проблему, я был бы очень благодарен.

Ответ №1:

Я только что столкнулся с точно такой же проблемой, но она появляется только при вызове модуля core . (Я доказал это, переименовав модуль, и он отлично сработал. Переименование обратно в core и ImportError исключение выдается снова).

Я довольно новичок в Python, но пришел к выводу, что это связано с другим модулем под названием core , уже существующим в моем Python path (хотя я не могу его найти).

Я решил это, просто выбрав другое имя для своего модуля (или, скорее, приложения Django)

Ответ №2:

Это циклический импорт. Вы делаете это import core.util.widgets.tab из user_interface , а затем пытаетесь импортировать user_interface изнутри tab . Это импорт, который никогда не может быть завершен из-за того, что природа каждого зависит от другого. В этой статье о них рассказывается более подробно:http://effbot.org/zone/import-confusion.htm#circular-imports .

Комментарии:

1. Моя ошибка, сбой в мозге из-за ручного ввода. пользовательский интерфейс — это user_interface. Я отредактирую вышесказанное.

2. полная строка импорта в tab.py это: из ядра импортировать пользовательский интерфейс, хост, события, язык, пути, что приводит к этой ошибке: File «/home/james/Documents/Projects/SCD/core/scd/widget/tab.py «, строка 10, в <module> из ядра импортируйте пользовательский интерфейс, хост, события, язык, пути Ошибка импортера: не удается импортировать имя user_interface

3. Есть ли способ разрешить tab.py для доступа к компонентам user_interface. что тогда? Я пытаюсь изменить назначение некоторого кода, и хотя многое из фактического кода изменилось, порядок импорта такой же, как и в исходном приложении для этих двух файлов. Исправлена та же ошибка ….

4. Ну, видимо, тогда мне нужно провести еще один рефакторинг. Интересно, с какой стати исходный код тогда вообще работал.

5. Возможно, проще всего было бы переместить tab требуемый код из user_interface в другой модуль, из которого они оба могут импортировать.