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

2 投票
2 回答
3532 浏览
提问于 2025-04-17 22:15

我有两个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循环导入(也就是这个设计有什么问题)

2 个回答

0

在你的lib文件夹里,有一个__init__.py文件吗?

如果有的话,你有两种选择:

1) __init__.py文件是空的,这样你可以用从lib导入a和b,像这样:

a.foo b.bar

2) 如果你的__init__.py文件里有导入a和b的指令,那么你可以这样写:

import lib.a as a
import lib.b as b

希望这对你有帮助!

1

因为没有直接的方法来解决循环导入的问题,所以我选择了一个变通办法。

在我的实际使用中,模块 a 只为了调用函数 b.fn 而导入了模块 b,所以我决定把 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

撰写回答