2011-05-26 121 views
9

我有一个目录结构:如何调试Python的导入失败

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

哪个版本的Python? – 2011-05-26 05:40:31

+0

@Ignacio:Version 2.7 – 2011-05-26 05:55:06

+0

你用什么python命令行来启动你的应用程序? – 2011-05-27 01:02:26

回答

4

这适用于我。你可以运行/ import model.py?如果它有语法错误,则不能导入它。 (一般我推荐不是做相对进口,使用它们是有限的)。

你的绝对导入非常混乱。在这个包中进行绝对导入的方法是:

from network model import Node 

这工作正常。

我在顶层(以上网络)一个program.py:从network.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 

而且输出是:

Model <module 'network.model' from '/tmp/network/model.pyc'> 
Node <class 'network.model.Node'> 
Absolute <class 'network.model.Node'> 

所以,你可以看到它工作正常,你的错误是一些还有什么地方。

+0

如果我从network.model导入节点,它说ImportError:无法导入名称节点 – 2011-05-26 22:57:28

+0

@Neil G:当然。如上所示,您的相对导入是正确的,错误在其他地方,而不是您如何编写导入。现在,如果你阅读我的答案,你会看到我问你一个问题。如果你想得到这个帮助,我建议你回答它。 – 2011-05-27 05:13:51

+1

导入model.py是个问题。原来,model.py正在导入导入model.py的t_model.py。我差点把头发拉出来。非常感谢您的帮助。 – 2011-05-27 06:29:10

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,并且相对导入效果很好。

+0

谢谢。我在每个文件夹中都有'__init __。py'。 – 2011-05-26 05:55:33