Python 无法导入名称 <class>

10 投票
3 回答
51969 浏览
提问于 2025-04-17 17:49

我昨晚一直在为解决一个导入错误而苦恼。

这个问题很常见,但之前的问题都没有完全解决我的困扰。

我在使用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

你觉得我哪里出错了?我刚把整个文件夹结构重命名,因为我把这个模块结构搞得太乱了,但我觉得我快接近正确的样子了……

3 个回答

1

你的代码目录 就是 一个包。确保它上面的目录,也就是 C:\MyProject,根据你的错误信息来看,这个目录在你的 PYTHONPATH 中。

右键点击你的项目,打开菜单,然后选择 属性。接着选择 PyDev - PYTHONPATH,然后切换到 源文件夹 标签。检查一下上面提到的目录是否在里面;如果没有,就点击 添加源文件夹,从对话框中选择它,然后点击 确定

5

它在同一个文件夹里,使用相对的包名(这样做其实是个好习惯):

from .engine import Engine
12

看起来你遇到了一个循环导入的问题。

engine.py 文件里,你在导入 main_menu_widget,而在 main_menu_widget 文件里,你又在导入 engine

这就是一个明显的循环导入,Python 是不允许这样的做法的。

撰写回答