Python ImportError: 无法导入名称XXXX

3

我对Python非常新(刚开始阅读 Learn Python the Hard Way......),并且不明白为什么会出现这种臭名昭著的导入错误。我看到了很多其他的导入错误帖子,但没有一个与我的相同(至少我没有找到相同的帖子)。

我有一个叫做 ex48 (D:\LearnPython\projects\ex48) 的项目目录,在它里面有一个也叫做 ex48 的 子文件夹,例如 D:\LearnPython\projects\ex48\ex48(这样命名目录是不好的惯例吗?)。在其中有一个 ex48.py 文件,其中定义了一个非常简单的类,称为类 XXXX。我有一个包含一些简单单元测试的 ex48_test.py 文件;在这个测试文件中,如果我执行 from ex48.ex48 import XXXX,则当 ex48.py 文件位于子文件夹(D:\LearnPython\projects\ex48\ex48)中时,一切正常。

现在我不明白的是,为什么如果我将 ex48.py 放在主项目文件夹中,例如 (D:\LearnPython\projects\ex48) 并使用 from ex48 import XXXX 导入,它会给我一个 Import Error: cannot import name XXXX

顺便说一句,测试文件(ex48_test.py)位于 D:\LearnPython\projects\ex48\tests,我正在使用 nose 包运行测试。


你的子文件夹里有 __init__.py 文件吗? - Anand S Kumar
在我看来,LPTHW不是新手学习的好资源... - Joran Beasley
@AnandSKumar 是的,它确实可以。这是为什么? - dragonfly02
@JoranBeasley 我快要完成这本书了,尽管我没有完全按照作者的要求去做 :) - dragonfly02
1个回答

4
问题在于您有一个同名文件夹ex48,其中有一个__init__.py文件,使其成为有效的Python包。
因此,当您执行from ex48 import <something>时,Python会导入ex48包,并尝试从中导入<something>,但在包(__init__.py)中找不到它时,就会出现ImportError
我猜您的目录结构如下 -
ex48/
     ex48.py
     ex48/
          __init__.py

因此,当您导入 ex48 时,实际上是在导入 ex48 包。您可以通过在 ex48_test.py 文件中执行以下操作来验证此内容-

import ex48
print(ex48.__file__)

这应该导入你的ex48文件夹内的__init__.py文件。

解决方案是将文件夹重命名,以避免与你的ex48模块发生冲突。


你说得完全正确!我会再多了解一下Python包是如何工作的,这也是我不能理解这个错误的主要原因。非常感谢。 - dragonfly02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接