Почему я получаю ImportError, когда класс существует в модуле? - PullRequest
0 голосов
/ 27 февраля 2020

Мой проект содержит только четыре модуля в одном каталоге. Все работало нормально, прежде чем я попытался добавить дополнительное меню настройки. Теперь я получаю ImportError, когда класс существует в этом модуле:

python3 -m project
Traceback (most recent call last):
  File "/usr/lib64/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib64/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/project/__main__.py", line 1, in <module>
    from project.gui import Window
  File "/home/project/gui.py", line 4, in <module>
    from project.document import Document
  File "/home/project/document.py", line 3, in <module>
    from project.salary import Salary
  File "/home/project/salary.py", line 3, in <module>
    from project.gui import Setup
ImportError: cannot import name 'Setup' from 'project.gui' (/project/gui.py)

Вот структура (модули, импорт, классы, данные) моего проекта:

* document.py
    from project.salary import Salary

    class Record
    class Document

* gui.py
    from project.document import Document
    from project.predefined import VALUES

    class Gui(tk.Tk)
    class Window(Gui)
    class Setup(Gui)

* __main__.py
    from project.gui import Window

* salary.py
    from project.gui import Setup

    dataclass Record
    VALUES = (Records, )
    class Loader
    class Salary

* predefined.py
    dataclass Record
    VALUES = (Records, )

Я не Я не понимаю, почему это происходит, мне кажется, все в порядке. Не могли бы вы объяснить, пожалуйста, это поведение и как я могу это исправить?

Редактировать: Я изменил структуру проекта, чтобы избежать циклической зависимости импорта, как это предлагается в комментариях. Обновлена ​​структура (dataclass Record и VALUES временно дублированы в salary.py и predefined.py). Я все еще получаю ту же ошибку.

1 Ответ

1 голос
/ 27 февраля 2020

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

  1. documents.py запускается и нажимает 'import Salary'
  2. Компилятор переходит к salary.py чтобы импортировать Зарплату и в первую строку в хитах:

    из проекта. gui настройка импорта

  3. Переход к gui .py для импорта настроек.

  4. в gui .py он будет запускаться

    из файла project.document import Document

Теперь, начиная с первого шага, он все еще ожидает импорта Salary и не создал класс Document, это препятствует запуску gui .py 'class SetUp', и поэтому вы получаете сообщение об ошибке, что он не найден.

Лучшее решение состоит в том, чтобы избежать циклического импорта или разбить его, просто используя 'import name_of_module'. Однако, опять же, лучше избегать этой практики.

Для дальнейшего использования я предлагаю вам прочитать: https://stackabuse.com/python-circular-imports/

...