如何调试Python导入失败

10 投票
2 回答
19314 浏览
提问于 2025-04-16 18:22

我有一个文件夹结构:

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'>

所以你可以看到,这样是没问题的,你的错误可能出在其他地方。

撰写回答