【问题标题】:How to fix Python circular import error (top level)?如何修复 Python 循环导入错误(顶级)?
【发布时间】:2021-05-07 23:31:30
【问题描述】:

我阅读了有关该错误的解决方案(写 import 而不是 from ...)但我认为它不起作用,因为我有一个复杂的文件夹结构。

quiz.models

import apps.courses.models as courses_models
courses_models.Lesson  # some actions with that class


class Quiz:
    pass

课程.模型

import apps.quiz.models as quiz_models
quiz_models.Quiz  # some actions with that class


class Lesson:
    pass

错误:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/usr/local/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/usr/local/lib/python3.8/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/code/apps/carts/models.py", line 5, in <module>
    from ..courses.models import Course
  File "/code/apps/courses/models.py", line 12, in <module>
    import apps.quiz.models as quiz_models
  File "/code/apps/quiz/models.py", line 12, in <module>
    class Quiz(TimestampedModel):
  File "/code/apps/quiz/models.py", line 15, in Quiz
    courses_models.Lesson, default=1, on_delete=models.DO_NOTHING, verbose_name=_('Lesson'), related_name='quizzes')
AttributeError: partially initialized module 'apps.courses.models' has no attribute 'Lesson' (most likely due to a circular import)

也许您有其他循环导入的解决方案,或者我只是将导入写错了?

【问题讨论】:

  • 这能回答你的问题吗? Circular import dependency in Python
  • 如果模块 A 导入模块 B,则 B,即其中的所有代码,在 A 导入时执行。如果 B 中的代码引用了 A 中的一个对象,因为 A 的执行仍在第 1 行的 import B 语句处,但该对象的定义在 A 的第 322 行,所以该对象尚未定义,那么您将循环导入失败。您无法更改编写import 语句的方式来修复它。要么结合2个模块;或(如果可能)推迟import B 直到 A 定义 B 所指的对象之后;或者将相互依赖的代码移到自己的模块中。
  • 如果你知道 Django 请检查一下,这是我的详细问题stackoverflow.com/questions/67446192/…

标签: python django


【解决方案1】:

是的,这是循环导入。 course.models 正在导入 quiz.models,而 quiz.models 也在导入 course.models

为避免这种情况,您可以defer the import until you really need it

【讨论】:

猜你喜欢
  • 2022-06-28
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多