嵌套的相对进口似乎不起作用

时间:2016-07-30 12:44:27

标签: python python-2.7 import

描述

我有一个包结构,其中各种模块需要从不同的模块获取信息,因此我使用相对导入。碰巧那些相对进口是以某种方式嵌套的 我将向您介绍我的包装结构:

.
├── core
│   ├── __init__.py
│   ├── sub1
│   │   ├── __init__.py
│   │   └── mod1.py
│   └── sub2
│       ├── __init__.py
│       ├── mod1.py
│       └── sub1
│           ├── __init__.py
│           └── mod1.py
└── main.py

这些文件包含以下语句:

main.py:

print __name__
import core.sub2.mod1

芯/ SUB2 / mod1.py

print __name__
import sub1.mod1

芯/ SUB2 / SUB1 / mod1.py

print __name__
from ...sub1 import mod1

芯/ SUB1 / mod1.py

print __name__
from ..sub2 import mod1

可视化

导入的可视化:

Visualization

问题

当我运行python main.py时,我收到以下错误(我用./<path-to-file>替换了绝对文件路径):

__main__
core.sub2.mod1
core.sub2.sub1.mod1
core.sub1.mod1
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    import core.sub2.mod1
  File "./core/sub2/mod1.py", line 2, in <module>
    import sub1.mod1
  File "./core/sub2/sub1/mod1.py", line 2, in <module>
    from ...sub1 import mod1
  File "./core/sub1/mod1.py", line 2, in <module>
    from ..sub2 import mod1
ImportError: cannot import name mod1

this question我了解到python使用模块的__name__属性来解析它在包中的位置。所以我打印了所有模块的名称,它们似乎没问题!为什么我会得到ImportError呢?我怎样才能使所有导入工作?

1 个答案:

答案 0 :(得分:0)

正如@Blckknght指出的那样,你有一个导入周期。你可以通过重新组织你的代码来消除这个恼人的循环。

但是,如果您在导入core.sub2.mod1时不必立即调用core.sub1.mod1,则有一种简单的方法可以解决此问题。

您可以导入core.sub2并稍后调用core.sub2.mod1

芯/ SUB1 / mod1.py

print __name__
from .. import sub2
def foo():
    t = sub2.mod1