【问题标题】:Python ImportError: cannot import name '..' from partially initialized module '..' (most likely due to a circular import)Python ImportError:无法从部分初始化的模块“..”导入名称“..”(很可能是由于循环导入)
【发布时间】:2022-06-22 23:21:27
【问题描述】:

我已经阅读了关于此的其他主题,但它们并没有真正帮助我。

我必须有 2 个 .py 文件,它们都位于 ets.routes 下,分别称为 agreements.pyapprovals.py

文件agreements.pyapprovals导入几个方法:

from ets.routes.approvals import getPendingApprovals, getIsApprover

它本身还公开了一个实用方法,该方法应该可供approvals 使用,称为authorize_agreement

如果我愿意,现在在approvals.py

from ets.routes.agreements import authorize_agreement

我得到了错误

ImportError: cannot import name 'getPendingApprovals' from partially initialized module 'ets.routes.approvals' (most likely due to a circular import) 
(C:\gitForVS\app\api\ets\routes\approvals.py)

我无法将authorize_agreement 移动到像utils.py 这样的外部文件中,它确实应该在agreements.py 中,因为它使用了大量的数据库和相关的协议级代码,这些代码在那里可用。只是这个函数应该由它的兄弟导入,而它自己导入一些兄弟的函数。为什么会有这样的问题?您是否需要在 Python 中进行单向导入(例如,仅来自 approvals -> agreements)?

【问题讨论】:

  • 这个错误通常意味着你有循环导入。
  • 事实上,代码示例显示这是一个循环导入。
  • 您可以将其设为“有条件”导入。例如,如果您只需要 authorize_agreementapprovals.py 模块中的特定函数内,请将导入行放在该函数内。然后在导入包或模块时不会执行导入,而只会在执行函数时执行,避免循环导入。
  • 关于您的问题“您是否需要在 Python 中进行单向导入(例如,仅从批准 -> 协议)?”:考虑一下当模块 A 从模块 B 导入时这意味着什么,以及模块 B 从模块 A 中导入。你遇到了先有鸡还是先有蛋的问题。用你的导入画几张图,看看你能不能解决它:你可能会发现你遇到了问题。
  • 并非如此,其他语言允许这样做,例如 Java。

标签: python


【解决方案1】:

您收到错误的原因是模块 a 无法从模块 b 导入函数,而模块 b 同时尝试从模块 a 导入函数。您的一个模块需要先定义另一个模块想要的功能,然后再从另一个模块导入它想要的功能。

例如:

文件 A:

from fileb import sum2

def sum(a, b):
    return a + b

文件 B:

def sum2(a, b):
    return a + b + a

from filea import sum # This works

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2022-01-08
    • 2020-05-20
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 2021-09-22
    相关资源
    最近更新 更多