Python 循环导入,`from lib import module` 与 `import lib.module`
我有两个Python模块,a.py
和b.py
,它们都在当前目录的lib/
文件夹里。假设这两个模块需要互相使用对方的功能。
a.py:
import lib.b
...
b.py:
import lib.a
...
上面的例子可以正常工作。
PYTHONPATH=./lib python -c 'from lib import a, b'
但是,如果我把a.py
和b.py
中的导入语句改成from lib import b
和from lib import a
,那么运行Python命令时就会出现ImportError
错误。
有人能解释一下为什么会这样吗?我并不是想从a
或b
中导入任何成员。(如果是那样的话,我就会从一个未初始化的模块中导入,就像下面提到的问题所指出的那样。)
参考:
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
...
这样一来,模块 a
和 b
之间的循环导入问题就解决了,任何其他导入了 b
的模块都可以直接使用 b.fn
。