python 巨蟒 Django :导入错误:无法从部分初始化的模块'...'汇入名称'...'(很可能是因为循环汇入)(......)

arknldoa  于 2022-10-30  发布在  Python
关注(0)|答案(3)|浏览(286)

在一个Django项目中,我需要从file-1导入class-A到file-2,从file-2导入class-B到file-1。
这些类有它们独特的方法,我想在另一个文件中使用这些方法(如上面的描述)。

我正在使用:

Python 3.8.10(在虚拟环境中)
Windows 10 - 64位(最新版本)
Django 4.0.4
当我运行python manage.py runserver时,我看到以下错误:
第一个
当我在ea_utils.pylogin_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服务器成功启动。

F:\my_ea_proj\ea_proj\ea_app\all_utils\ea_utils.py:
from ea_app.login_request_based import full_request

F:\my_ea_proj\ea_proj\ea_app\login_request_based.py
from ea_app.all_utils.ea_utils import ea_utils_class

如何解决此问题?

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

What happens when using mutual or circular (cyclic) imports in Python?
如果你导入foo(在www.example.com中bar.py)和import bar(在www.example.com中foo.py),它会运行得很好。当任何东西实际运行时,这两个模块都将被完全加载,并将有对彼此的引用。
问题是当你从foo导入abc(在www.example.com内bar.py)和从bar导入xyz(在www.example.com内foo.py)时,因为现在每个模块都要求另一个模块在导入之前已经导入(这样我们导入的名称就存在了)。

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

rur96b6h

rur96b6h1#

我在使用以下文件结构时遇到了同样的问题:

├───models
│   │   app_1.py
│   │   __init__.py # (will refer to this as models.init)
│   │
│   ├───engines
│   │       app_2.py
│   │       __init__.py

models.init中,我有一个来自app_2的示例,如下所示

from models.engines.app_2 import app2_class
new_app = app2_class()
new_app.do_something()

在我的app_1模块中,我有这些导入:

from models import new_app

在我的app_2模块中,我有这些导入:

from models.app_1 import app1_class

我尝试了几种解决方法,但是没有一种对我有效,但是我能够摆脱这个错误,并且使models.init中的所有类和示例都能正常工作。这是我得到的最终解决方案。models.init没有任何变化,因为我需要访问它。app_2也没有任何变化。
在我的app_1模块中,我修改为:

import models

    # Somewhere in the code, I went with
    models.new_app.do_something_different()

希望这对你有用。

fykwrbwg

fykwrbwg2#

我遇到了一个非常相似的问题,讽刺的是,我把需要导入的类分离到一个单独的模型文件(models_3.py)中,从那里导入对我来说是有效的,我仍然不知道为什么会发生这种情况,因为我有其他的模型。它们是这样工作的,但似乎有特定的情况。
旧结构:

├───app
│   │   models_1.py
│   ├   models_2.py
│   │   __init__.py

新结构:

├───app
│   │   models_1.py
│   ├   models_2.py
│   ├   models_3.py
│   │   __init__.py
uqcuzwp8

uqcuzwp83#

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

from characters.models import Character

class Inventory(models.Model):
    character = models.OneToOneField(Character, on_delete=models.CASCADE, related_name='inventory')

您可以执行此操作,因此删除开头的import


# from characters.models import Character  # Becomes useless

class Inventory(models.Model):
    character = models.OneToOneField('characters.Character', on_delete=models.CASCADE, related_name='inventory')

相关问题