当模块中存在类时为什么出现ImportError?

问题描述 投票:0回答:1

我的项目在单个目录中仅包含四个模块。在尝试添加其他设置菜单之前,一切工作正常。现在,当该模块中存在类时,我得到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)

这里是我项目的结构(模块,导入,类,数据):

* 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, )

我不明白为什么会这样,一切对我来说似乎都还不错。您能否解释一下这种现象,我该如何解决?

编辑:我已更改项目的结构,以避免注释中建议的循环导入依赖性。更新了结构(dataclass RecordVALUESsalary.pypredefined.py中临时复制)。我仍然遇到相同的错误。

python import project importerror
1个回答
1
投票

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

  1. documents.py运行并点击'import Salary']”>
  2. [编译器转到Salary.py导入Salary,并在命中的第一行:

  3. 从project.gui导入设置

  4. 进入gui.py导入设置。

  5. 在gui.py中它将运行

  6. 从project.document导入文档

    现在从第一步开始,它仍在等待Salary的导入,并且还没有构建Document类,这阻止gui.py运行'class SetUp',因此您将得到一个找不到该错误的错误。

最佳解决方案是避免循环导入或仅通过使用'import name_of_module'对其进行破坏。但是,同样,最好避免这种做法。

供将来参考,我建议您阅读:https://stackabuse.com/python-circular-imports/

© www.soinside.com 2019 - 2024. All rights reserved.