即使import语句在先前的代码中工作,Python模块在import语句中也有属性错误

时间:2018-12-17 04:10:56

标签: python python-3.x python-import

我有一个项目突然停止正常运行。我不知道为什么,因为我事先没有对其进行任何更改。

构建它时出现以下错误:

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'

此处阅读的所有内容均为import语句,无其他内容。

此处的文件夹结构:

.
├──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 :(得分:0)

我认为问题在于game_panel_controller.py试图在其直接路径之外进行导入。我认为此时PATH的范围包括立即目录和库目录,而不是执行脚本的目录。

因此,即使engine.py可以导入model.game,controllers.game_panel_controller也不能(因为它不在game_panel_controller脚本的直接目录中)。

你可以

from .. import model.game

或者您也可以使用符号链接或代码的重构(或者您可以在导入之前研究修改路径)。

答案 1 :(得分:0)

我不知道确切原因,但是我之前遇到过这个问题。 你可以试试看 export PYTHONPATH=.

答案 2 :(得分:0)

我认为您有循环进口的情况。

engine.py导入controllers.game_panel_controller,后者又导入model.game,后者又导入model.floor,又又导入了model.game

您说您没有做任何更改,因此它也不应该在之前生效。我无法解释。您确定没有任何改变?

答案 3 :(得分:0)

我想出了解决办法,但我仅部分理解为什么会发生这种情况。

我意识到一个月前我已经将python版本从3.7.1更改为3.5.4rc1,这不能正常运行。将Windows环境变量改回指向正确的文件夹可以解决此问题,并且可以正确构建。

所以我想在3.5.4rc1中无法完成我的工作,但在3.7.1中是可能的。

现在,特别是进行了哪些更改,使得以前不可能的现在变为可能仍然是一个谜。