Python 循环导入, `from lib import module` 与 `import lib.module`

标签 python python-2.7 import

我有两个 python 模块,a.pyb.py,它们都在相对于当前目录的 lib/ 中.假设每个模块都需要另一个模块的功能。

a.py:

import lib.b
...

b.py:

import lib.a
...

上面的例子适用于

PYTHONPATH=./lib python -c 'from lib import a, b'

但是,如果我将 a.pyb.py 中的导入切换为 from lib import bfrom lib import a,上面的 Python 命令以 ImportError 终止。

有人可以解释一下为什么会这样吗?我没有尝试从 ab 导入任何成员。 (在那种情况下,我会从一个未初始化的模块导入,正如下面提到的问题所指出的那样。)

引用:

  1. python circular imports once again (aka what's wrong with this design)

最佳答案

由于似乎没有直接的方法来解决循环导入问题,我采用了一种解决方法。

在我的实际用例中,模块a导入模块b只是为了调用函数b.fn,所以我决定把fn 在第三个模块 c 中导入 c 代替:

c.py

def fn():
  ...

b.py

from lib import a
from lib import c
...
# Explicitly assign `fn` into this module.
fn = c.fn

(以上也可以用 from lib.c import fn 完成,但我更喜欢显式版本。)

a.py

from lib import c
...

这样,ab 之间的循环导入就消失了,任何导入 b 的附加模块都可以使用 b .fn 直接。

关于Python 循环导入, `from lib import module` 与 `import lib.module`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22397610/

相关文章:

python - 没有名为 unidecode 的模块

python - 动态传递字典名称python

python - 使用Python从MS Access中提取数据

r - readxl(将excel文件导入R)错误

python - 升级到 PyTorch 1.9 时的潜在错误 ImportError : cannot import name 'int_classes' from 'torch._six'

python 3 : Write to File from Cursor Based List

python - 数据类和属性装饰器

python - 关于递归的问题

python - Tensorflow 多类 ML 模型问题

python - 仅给出子列表的元素(Python),查找列表中元素的索引的最有效方法是什么