如何调试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'
补充:这是一个循环导入的问题。
2 个回答
0
来自这个问题。
project/
program.py # entry point to the program
network/
__init__.py
transform/ # .. will target network
__init__.py
我觉得你也可以从下面的目录执行network/model.py,这样就能实现对network的相对导入。所以……
network/
model.py
__init__.py
然后你可以用$ python network/model.py
来启动程序。你可能需要直接运行__init__.py
,也可能不需要。我有一个应用程序是针对module/__init__.py
的,相对导入效果很好。
4
这个方法对我有效。你能运行或导入 model.py 吗?如果里面有语法错误,你就无法导入它。(一般来说,我建议不要使用相对导入,因为它们的使用场景有限。)
你的绝对导入方式让人很困惑。在这个包里,正确的绝对导入方式是:
from network model import Node
这样做是没问题的。
我在最上层(在 network 目录上面)有一个 program.py 文件:
from 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'>
所以你可以看到,这样是没问题的,你的错误可能出在其他地方。