python导入: `from lib import module` 和 `import lib.module`

Python circular import, `from lib import module` vs `import lib.module`

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

A.PY:

1
2
import lib.b
...

B.PY:

1
2
import lib.a
...

上面的示例适用于

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

但是,如果我将a.pyb.py中的导入分别切换到from lib import bfrom lib import a中,上述python命令将以ImportError终止。

有人能解释一下为什么会这样吗?我不想从ab进口任何成员。(在这种情况下,我将从未初始化的模块导入,正如下面引用的问题所指出的那样。)

参考文献:

  • python循环再次导入(也就是说,这个设计有什么问题)

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

    在我的实际用例中,模块a导入的模块b只调用函数b.fn,所以我决定将fn放入第三个模块c中,而导入c

    C.Py

    1
    2
    def fn():
      ...

    B.Py

    1
    2
    3
    4
    5
    from lib import a
    from lib import c
    ...
    # Explicitly assign `fn` into this module.
    fn = c.fn

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

    A.Py

    1
    2
    from lib import c
    ...

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


    在lib文件夹中有一个init文件?如果是,您有两种可能性:

    1)uuu init_uuu.py为空,可以从lib导入a、b中使用。

    A.Fo.B.Bar

    2)在你的初始化中有导入a,b的指令,在这种情况下,你可以写

    将lib.a导入为将lib.b导入为b

    希望这对你有帮助