Python Django:导入错误:无法从部分初始化的模块“...”导入名称“...”(很可能是由于循环导入)(......)

ali*_*eza 2 python windows django python-3.x

在 Django 项目中,我需要从 file-2 中的 file-1 导入 class-A。并从 file-2 导入 file-1 中的 B 类。

\n

这些类有其独特的方法,我想在另一个文件中使用这些方法(如上面的描述)。

\n

我正在与:

\n
\n

Python 3.8.10(在虚拟环境中)

\n

Windows 10 - 64 位(最新版本)

\n

姜戈 4.0.4

\n
\n

当我运行时python manage.py runserver,我看到以下错误:

\n
(my_ea_proj) PS F:\\my_ea_proj\\ea_proj> python.exe .\\manage.py runserver\nTraceback (most recent call last):\n  File ".\\manage.py", line 30, in <module>\n    main()\n  File ".\\manage.py", line 13, in main\n    django.setup()\n  File "F:\\my_ea_proj\\lib\\site-packages\\django\\__init__.py", line 24, in setup\n    apps.populate(settings.INSTALLED_APPS)\n  File "F:\\my_ea_proj\\lib\\site-packages\\django\\apps\\registry.py", line 116, in populate\n    app_config.import_models()\n  File "F:\\my_ea_proj\\lib\\site-packages\\django\\apps\\config.py", line 304, in import_models\n    self.models_module = import_module(models_module_name)\n  File "C:\\Python38\\lib\\importlib\\__init__.py", line 127, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import\n  File "<frozen importlib._bootstrap>", line 991, in _find_and_load\n  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked\n  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked\n  File "<frozen importlib._bootstrap_external>", line 848, in exec_module\n  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed\n  File "F:\\my_ea_proj\\ea_proj\\ea_app\\models.py", line 16, in <module>\n    from .login_request_based import full_request\n  File "F:\\my_ea_proj\\ea_proj\\ea_app\\login_request_based.py", line 10, in <module>\n    from ea_app.all_utils.ea_utils import ea_utils_class\n  File "F:\\my_ea_proj\\ea_proj\\ea_app\\all_utils\\ea_utils.py", line 10, in <module>\n    from ea_app.login_request_based import full_request\nImportError: cannot import name \'full_request\' from partially initialized module \'ea_app.login_request_based\' (most likely due to a circular import) (F:\\my_ea_proj\\ea_proj\\ea_app\\login_request_based.py)\n
Run Code Online (Sandbox Code Playgroud)\n
F:\\my_ea_proj\\ea_proj>tree /F\nF:.\n\xe2\x94\x82   manage.py\n\xe2\x94\x82   __init__.py\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80ea_app\n\xe2\x94\x82   \xe2\x94\x82   admin.py\n\xe2\x94\x82   \xe2\x94\x82   apps.py\n\xe2\x94\x82   \xe2\x94\x82   login_request_based.py\n\xe2\x94\x82   \xe2\x94\x82   models.py\n\xe2\x94\x82   \xe2\x94\x82   tasks.py\n\xe2\x94\x82   \xe2\x94\x82   tests.py\n\xe2\x94\x82   \xe2\x94\x82   urls.py\n\xe2\x94\x82   \xe2\x94\x82   views.py\n\xe2\x94\x82   \xe2\x94\x82   __init__.py\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80all_utils\n\xe2\x94\x82   \xe2\x94\x82       ea_remote_db.py\n\xe2\x94\x82   \xe2\x94\x82       ea_utils.py\n\xe2\x94\x82   \xe2\x94\x82       __init__.py\n\xe2\x94\x82   \xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80migrations\n\xe2\x94\x82   \xe2\x94\x82       __init__.py\n\xe2\x94\x82   |       ...skipped other migration files...\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80ea_proj\n        asgi.py\n        settings.py\n        urls.py\n        wsgi.py\n        __init__.py\n
Run Code Online (Sandbox Code Playgroud)\n

ea_utils.py当我在和文件中添加以下类时login_request_based.py,出现错误ImportError: cannot import name \'full_request\' from partially initialized module \'ea_app.login_request_based\' (most likely due to a circular import)...但是当我注释掉其中之一时,问题已解决并且内置 Web 服务器已成功启动。

\n
F:\\my_ea_proj\\ea_proj\\ea_app\\all_utils\\ea_utils.py:\nfrom ea_app.login_request_based import full_request\n\nF:\\my_ea_proj\\ea_proj\\ea_app\\login_request_based.py\nfrom ea_app.all_utils.ea_utils import ea_utils_class\n
Run Code Online (Sandbox Code Playgroud)\n

如何解决这个问题?

\n

谢谢@mohamed-beltagy。但您的评论/链接没有解决我的问题。请阅读下面的注释。

\n

在 Python 中使用相互或循环(循环)导入时会发生什么?

\n
\n

如果您确实 import foo (在 bar.py 内)并导入 bar (在 foo.py 内),\nit 会正常工作。当任何东西实际运行时,两个模块\n都将被完全加载并且将相互引用。

\n

问题是当您执行 from foo import abc (inside bar.py)\n 和 from bar import xyz (inside foo.py) 时。因为现在每个模块都需要先导入另一个模块(以便我们要导入的名称存在)才能导入。

\n
\n
\n

请注意,如果您执行 from foo import * 和 from bar import *,则 foo 中执行的所有内容都处于 bar 的初始化阶段,并且 bar 中的实际函数尚未定义...

\n
\n

Gui*_*TeK 5

如果在其中一个模块中您导入模型只是为了与其建立关系,例如:

from characters.models import Character

class Inventory(models.Model):
    character = models.OneToOneField(Character, on_delete=models.CASCADE, related_name='inventory')
Run Code Online (Sandbox Code Playgroud)

您可以执行此操作,然后删除import开头的:

#from characters.models import Character  # Becomes useless

class Inventory(models.Model):
    character = models.OneToOneField('characters.Character', on_delete=models.CASCADE, related_name='inventory')
Run Code Online (Sandbox Code Playgroud)