如何调试Python导入失败

时间:2011-05-26 05:39:14

标签: python import python-import

我有一个目录结构:

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'

修改:这是循环导入

2 个答案:

答案 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)

来自this question

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的应用程序引擎程序,相对导入效果很好。