Python 当类存在于模块中时,为什么我会得到ImportError?

Python 当类存在于模块中时,为什么我会得到ImportError?,python,import,project,importerror,Python,Import,Project,Importerror,我的项目在一个目录中只包含四个模块。在我尝试添加额外的设置菜单之前,一切正常。现在,当该模块中存在类时,我得到了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

我的项目在一个目录中只包含四个模块。在我尝试添加额外的设置菜单之前,一切正常。现在,当该模块中存在类时,我得到了
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)
我不明白为什么会这样,对我来说一切似乎都很好。你能给我解释一下这种行为吗?我怎样才能纠正它


编辑:我已经改变了项目的结构,以避免注释中建议的循环导入依赖。更新的结构已启动(
dataclass记录
salary.py
prefined.py
中临时复制)。我仍然收到相同的错误。

您使用的是循环依赖项,这导致了此错误。我认为您提供的代码中的程序步骤如下:

  • documents.py运行并点击“导入薪资”
  • 编译器转到salary.py以导入薪资和命中数的第一行:

    从project.gui导入设置

  • 它转到gui.py以导入安装程序

  • 在gui.py中,它将运行

    从project.document导入文档

  • 现在,从第一步开始,它仍在等待导入薪资,并且尚未构建文档类。这会阻止gui.py运行“类设置”,因此您会收到一个未找到的错误

    最好的解决方案是避免循环导入或仅使用“导入模块的导入名称”来打破循环导入。然而,同样,最好避免这种做法


    作为将来的参考,我建议您阅读:

    这是否回答了您的问题@FlyingTeller@WGriffing谢谢你指出这一点。这是我第一次听说循环导入依赖性。我试图将
    移动到新模块
    预定义的.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, )