【问题标题】:Python cannot import name <class>Python 无法导入名称 <class>
【发布时间】:2013-03-04 03:14:59
【问题描述】:

我大半夜都在努力解决导入错误。

这是一个常见问题,但之前没有一个问题能完全回答我的问题。

我正在使用 PyDev(一个 Eclipse 插件)和库 Kivy(一个 Python 库)

我的文件结构是这样设置的:

<code>
    __init__.py
    main.py
    engine.py
    main_menu_widget.py

“code”保存在 eclipse 文件夹“MyProject”中,但它不是一个包,所以我没有包含它。

文件如下所示:

main.py

# main.py
from code.engine import Engine

class MotionApp(App):
    # Ommited

engine.py

# engine.py
from code.main_menu_widget import MainMenuWidget

class Engine():
    # Ommited

main_menu_widget.py

# main_menu_widget.py
from code.engine import Engine

class MainMenuWidget(Screen):
    pass

我收到的错误详细信息是:

 Traceback (most recent call last):
   File "C:\MyProject\code\main.py", line 8, in <module>
     from code.engine import Engine
   File "C:\MyProject\code\engine.py", line 6, in <module>
     from code.main_menu_widget import MainMenuWidget
   File "C:\MyProject\code\main_menu_widget.py", line 3, in <module>
     from code.engine import Engine

知道我在这里做错了什么吗?我刚刚重命名了我的整个文件夹结构,因为我把这个模块结构搞砸了,但我认为我已经接近它应该看起来的样子了......

【问题讨论】:

标签: python


【解决方案1】:

似乎有一个循环导入。 从 engine.py 你正在导入 main_menu_widget 而从 main_menu_widget你正在导入 engine

这显然是python不允许的循环导入。

【讨论】:

    【解决方案2】:

    它在同一个文件夹中,使用一个相对的包名(无论如何这样做是个好习惯):

    from .engine import Engine
    

    【讨论】:

    • 不是code.engine?这不是更有意义吗,因为它都在根“代码”包中?
    • 从您自己的项目中导入内容时,使用相对导入通常是一个好习惯。
    • 很公平。我刚刚尝试过,没有运气,它会抛出相同的错误,相同的行。 “无法导入名称引擎”
    • 哦,你有一个循环依赖,main_menu_widget.py 依赖于 engine.py 和 vica verca
    • 是的,这是一个循环依赖。也是个坑爹的单身狗。谢谢,我为此发布了一个新问题,但确实找到了绕过的方法。希望错误消息更具描述性! stackoverflow.com/questions/15216424/…
    【解决方案3】:

    你的代码目录一个包。确保它上面的目录,即 C:\MyProject 从您的错误消息判断,在您的 PYTHONPATH 中。

    选择您的项目并单击鼠标右键打开上下文菜单,然后选择属性。选择 PyDev - PYTHONPATH 并从那里选择 Source 文件夹 选项卡。 检查上述目录是否存在;如果没有按添加源文件夹,从对话框中选择它并按确定

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多