如何调试Python导入失败

Nei*_*l G 9 python import python-import

我有一个目录结构:

network/__init__.py
network/model.py
network/transformer/__init__.py
network/transformer/t_model.py
Run Code Online (Sandbox Code Playgroud)

这两个__init__.py文件都合适

__all__ = [
    "model",  # or "t_model" in the case of transformer
    "view",
    ]
Run Code Online (Sandbox Code Playgroud)

在t_model.py中,我有

from .. import model
Run Code Online (Sandbox Code Playgroud)

但它说:

ImportError: cannot import name model
Run Code Online (Sandbox Code Playgroud)

如果我试试

from ..model import Node
Run Code Online (Sandbox Code Playgroud)

它说:

ImportError: cannot import name Node
Run Code Online (Sandbox Code Playgroud)

这些都是非常令人困惑的错误.


编辑:即使绝对导入失败:

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'
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个循环导入.

Len*_*bro 4

这对我有用。你可以运行/导入 model.py 吗?如果它有语法错误,则无法导入它。(一般来说我建议不要做相对导入,它们的使用是有限的)。

你的绝对进口非常令人困惑。在此包中进行绝对导入的方法是:

from network model import Node
Run Code Online (Sandbox Code Playgroud)

这很好用。

我在顶层(网络之上)有一个program.py:

从网络.transformer导入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
Run Code Online (Sandbox Code Playgroud)

输出是:

Model <module 'network.model' from '/tmp/network/model.pyc'>
Node <class 'network.model.Node'>
Absolute <class 'network.model.Node'>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它工作正常,您的错误在其他地方。