如何调试 Python 导入失败

Posted

技术标签:

【中文标题】如何调试 Python 导入失败【英文标题】:How to debug Python import failure 【发布时间】:2011-09-02 07:29:12 【问题描述】:

我有一个目录结构:

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'

编辑:这是一个循环导入

【问题讨论】:

哪个版本的 Python? 您使用什么 python 命令行来启动您的应用程序? 问题“如何调试Python导入失败?”没有回答……(虽然具体问题已经解决了) 【参考方案1】:

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

【讨论】:

谢谢。我在每个文件夹中都有__init__.py【参考方案2】:

这对我有用。你能运行/导入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'>

所以你可以看到它工作正常,你的错误在其他地方。

【讨论】:

如果我从 network.model 导入节点,它说 ImportError: cannot import name Node @Neil G:当然。正如我在上面显示的那样,您的相对导入是正确的,错误出在其他地方,而不是您编写导入的方式。现在,如果您阅读我的回答,您会发现我问了您一个问题。如果您需要这方面的帮助,我建议您回答。 导入 model.py 是问题所在。原来,model.py 正在导入 t_model.py,而后者又导入了 model.py。我差点把头发拉出来。非常感谢您的帮助。 另外,我是否应该更喜欢绝对进口而不是相对进口?反之亦然? @Neil G:超级!乐意效劳!根据我的经验,您几乎不需要相对导入,而绝对导入会减少混乱。 :-)

以上是关于如何调试 Python 导入失败的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm 调试器中的“测试”包中的绝对导入失败并出现 ModuleNotFoundError

调试htcondor运行python脚本的问题

如何找出 PyImportModule 导入失败的原因?

Python导入requests失败更新pip失败解决办法

Python3导入cookielib失败

Python3.6的Enum类型导入失败