我有一个目录结构:
network/__init__.py
network/model.py
network/transformer/__init__.py
network/transformer/t_model.py
两个__init__.py
个文件都有适当的
__all__ = [
"model", # or "t_model" in the case of transformer
"view",
]
在t_model.py中,我有
from .. import model
但它说:
ImportError: cannot import name model
如果我尝试
from ..model import Node
它说:
ImportError: cannot import name Node
这些是非常令人困惑的错误。
编辑:即使绝对导入失败:
import network as N
print(dir(N), N.__all__)
import network.model as M
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'transformer'] ['model', 'view']
Traceback (most recent call last):..........
AttributeError: 'module' object has no attribute 'model'
修改:这是循环导入。
答案 0 :(得分:4)
这对我有用。你能运行/导入model.py吗?如果它有语法错误,则无法导入。 (一般情况下,我建议不进行相对导入,使用它们是有限的。)
你的绝对导入非常令人困惑。在此包中进行绝对导入的方法是:
from network model import Node
这很好用。
我在顶层(网络上方)有一个program.py:
来自network.transformer import t_model
t_model.py看起来像这样:
from .. import model
print "Model", model
from ..model import Node
print "Node", Node
from network.model import Node
print "Absolute", Node
输出是:
Model <module 'network.model' from '/tmp/network/model.pyc'>
Node <class 'network.model.Node'>
Absolute <class 'network.model.Node'>
因此,您可以看到它的工作正常,您的错误就在其他地方。
答案 1 :(得分:0)
project/
program.py # entry point to the program
network/
__init__.py
transform/ # .. will target network
__init__.py
我认为你也可以从下面的目录中执行network / model.py并获得相对的网络导入。所以...
network/
model.py
__init__.py
然后您将使用$ python network/model.py
启动该程序。您可能需要也可能不需要点击__init__.py
。我有一个针对module/__init__.py
的应用程序引擎程序,相对导入效果很好。