当模块中存在 class 时,为什么会出现 ImportError?
Why do I get ImportError when class exists in module?
我的项目在单个目录中仅包含四个模块。在我尝试添加额外的设置菜单之前一切正常。现在,当此模块中存在 class 时,我得到 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)
这是我项目的结构(模块、导入、classes、数据):
* 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 Record
和 VALUES
在 salary.py
和 predefined.py
中临时重复)。我仍然遇到同样的错误。
您正在使用导致此错误的循环依赖。我认为您提供的代码中的程序步骤如下:
- documents.py 运行秒并点击 'import Salary'
编译器转到 salary.py 导入 Salary 并在命中的第一行:
从 project.gui 导入设置
进入gui.py导入设置。
在gui.py中它将运行
从 project.document 导入文档
现在从第一步开始,它仍在等待导入工资并且尚未构建文档 class 这会阻止 gui.py 到 运行 'class SetUp' 和因此,您会收到一个错误消息,指出找不到它。
最好的解决方案是避免循环导入或仅使用 'import name_of_module' 来破坏循环导入。但是,再次强调,最好避免这种做法。
为了将来参考,我建议您阅读:https://stackabuse.com/python-circular-imports/
我的项目在单个目录中仅包含四个模块。在我尝试添加额外的设置菜单之前一切正常。现在,当此模块中存在 class 时,我得到 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)
这是我项目的结构(模块、导入、classes、数据):
* 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 Record
和 VALUES
在 salary.py
和 predefined.py
中临时重复)。我仍然遇到同样的错误。
您正在使用导致此错误的循环依赖。我认为您提供的代码中的程序步骤如下:
- documents.py 运行秒并点击 'import Salary'
编译器转到 salary.py 导入 Salary 并在命中的第一行:
从 project.gui 导入设置
进入gui.py导入设置。
在gui.py中它将运行
从 project.document 导入文档
现在从第一步开始,它仍在等待导入工资并且尚未构建文档 class 这会阻止 gui.py 到 运行 'class SetUp' 和因此,您会收到一个错误消息,指出找不到它。
最好的解决方案是避免循环导入或仅使用 'import name_of_module' 来破坏循环导入。但是,再次强调,最好避免这种做法。
为了将来参考,我建议您阅读:https://stackabuse.com/python-circular-imports/