Модуль Python имеет ошибку атрибута в операторе импорта, хотя оператор импорта работает в предыдущем коде - PullRequest
0 голосов
/ 17 декабря 2018

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

При его создании я получаю следующую ошибку:

Traceback (most recent call last):
  File ".\engine.py", line 7, in <module>
    from controllers.game_panel_controller import GamePanelController
  File "D:\Documents - HDD\Code\Allies_RL_Prototype\controllers\game_panel_controller.py", line 3, in <module>
    import model.game as game
  File "D:\Documents - HDD\Code\Allies_RL_Prototype\model\game.py", line 1, in <module>
    from model.floor import Floor
  File "D:\Documents - HDD\Code\Allies_RL_Prototype\model\floor.py", line 5, in <module>
    from model.components.player_component import PlayerComponent
  File "D:\Documents - HDD\Code\Allies_RL_Prototype\model\components\player_component.py", line 1, in <module>

    import model.game as game
AttributeError: module 'model' has no attribute 'game'

Все, что здесь читается, это операторы импорта ибольше ничего.

Структура папок здесь:

.
├──engine.py
├──controllers
|   └──game_panel_controller.py
└──model
    ├──game.py
    ├──floor.py
    └──components
        └──player_component.py

Странная часть заключается в том, что проблемное утверждение -

import model.game as game

, когда всего несколько операторов вышеэто, он запускает эту точную линию успешно.Это не то, что это недопустимый модуль или несуществующий файл.Что с этим не так?Почему он вдруг перестает нормально работать?

Это происходит в windows 10, Python 3.5.4rc1, с использованием windows powershell, выполняющего программу следующим образом:

python .\engine.py

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Я выяснил это, но я только частично понимаю, почему это происходит.

Я понял, что поменял версию Python месяц назад с 3.7.1 на 3.5.4rc1, что не работает нормально,Изменение переменной среды Windows обратно на указатель на нужную папку устранило проблему, и она собирается правильно.

Так что я полагаю, что делать то, что я делал, невозможно в 3.5.4rc1, но возможно в 3.7.1.

Теперь, конкретно, какие изменения были внесены, что делает возможным теперь, когда это было невозможно до , все еще остается загадкой.

0 голосов
/ 17 декабря 2018

Я не знаю точной причины, но я сталкивался с этой проблемой раньше.Вы можете попробовать это, export PYTHONPATH=.

0 голосов
/ 17 декабря 2018

Я думаю, у вас есть случай кругового импорта.

engine.py импорт controllers.game_panel_controller, который импортирует model.game, который импортирует model.floor, который снова импортирует model.game.

Вы сказали, что ничего не изменили, поэтому раньше это тоже не сработало.Я не могу это объяснить.Вы уверены ничего не изменилось?

0 голосов
/ 17 декабря 2018

Я считаю, что проблема в том, что game_panel_controller.py пытается импортировать за пределы своего непосредственного пути.Я думаю, что область действия PATH на этом этапе включает в себя непосредственный каталог и каталоги библиотеки, но не каталог исполняемого скрипта.

Так что, хотя engine.py может импортировать model.game, controllers.game_panel_controller не может(потому что его нет в непосредственном каталоге скрипта game_panel_controller).

Вы можете сделать

from .. import model.game

Или вы можете использовать sym-ссылки или рефакторинг кода (или выможет изучить искажение пути до импорта).

...