【问题标题】:Why do I get ImportError when class exists in module?当模块中存在类时,为什么会出现 ImportError?
【发布时间】:2020-02-27 14:44:20
【问题描述】:

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

我不明白为什么会这样,对我来说一切似乎都很好。你能解释一下这种行为吗?我该如何解决?

编辑:我已更改项目结构以避免循环导入依赖项,如 cmets 中所建议的那样。已更新结构(dataclass RecordVALUESsalary.pypredefined.py 中临时重复)。我仍然遇到同样的错误。

【问题讨论】:

  • 这能回答你的问题吗? Python circular importing?
  • @FlyingTeller @WGriffing 感谢您指出这一点。这是我第一次听说循环导入依赖。我试图将VALUES 移动到新模块predefined.py,但仍然得到ImportError

标签: python import project importerror


【解决方案1】:

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

  1. documents.py 运行并点击“import Salary”
  2. 编译器去salary.py导入Salary并在第一行点击:

    从 project.gui 导入设置

  3. 到 gui.py 导入设置。

  4. 在 gui.py 中它会运行

    从 project.document 导入文档

现在,从第一步开始,它仍在等待 Salary 被导入,并且尚未构建 Document 类,这会阻止 gui.py 运行“class SetUp”,因此您会收到找不到它的错误。

最好的解决方案是避免循环导入或仅使用'import name_of_module'来破坏它。不过,同样,最好避免这种做法。

为了将来的参考,我建议你阅读:https://stackabuse.com/python-circular-imports/

【讨论】:

  • 你是对的。我再次编辑了我的代码,发现我第一次错过了循环。现在一切正常,感谢您的有用讲座。
猜你喜欢
  • 2022-01-04
  • 2022-12-07
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多