我有一个包结构,其中各种模块需要从不同的模块获取信息,因此我使用相对导入。碰巧那些相对进口是以某种方式嵌套的 我将向您介绍我的包装结构:
.
├── core
│ ├── __init__.py
│ ├── sub1
│ │ ├── __init__.py
│ │ └── mod1.py
│ └── sub2
│ ├── __init__.py
│ ├── mod1.py
│ └── sub1
│ ├── __init__.py
│ └── mod1.py
└── main.py
这些文件包含以下语句:
print __name__
import core.sub2.mod1
print __name__
import sub1.mod1
print __name__
from ...sub1 import mod1
print __name__
from ..sub2 import mod1
导入的可视化:
当我运行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
呢?我怎样才能使所有导入工作?
答案 0 :(得分:0)
正如@Blckknght指出的那样,你有一个导入周期。你可以通过重新组织你的代码来消除这个恼人的循环。
但是,如果您在导入core.sub2.mod1
时不必立即调用core.sub1.mod1
,则有一种简单的方法可以解决此问题。
您可以导入core.sub2
并稍后调用core.sub2.mod1
。
print __name__
from .. import sub2
def foo():
t = sub2.mod1