我是python的新手(刚开始阅读学习Python的艰难之路......)并且无法理解为什么我得到这个相当臭名昭着的导入错误。我看过很多其他的导入错误帖子但是没有一个与我的相同(至少我没有找到相同的帖子)。
我有一个名为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
)中时,一切正常。
现在我不明白为什么如果我将Import Error: cannot import name XXXX
放在主项目文件夹中,它会给我一个ex48.py
,例如(D:\LearnPython\projects\ex48
)并导入from ex48 import XXXX
。
顺便说一下,测试文件(ex48_test.py)在D:\LearnPython\projects\ex48\tests
,我正在使用nose
包运行测试。
答案 0 :(得分:4)
isuse是你有一个同名的文件夹__init__.py
,里面有一个from ex48 import <something>
,使它成为一个有效的Python包。
因此,当您执行ex48
时,Python正在导入<something>
包,并且他们尝试从中导入__init__.py
,但在包中找不到某些内容({{1 ()包,)因此它给你ImportError
。
我猜你的目录结构看起来像 -
ex48/
ex48.py
ex48/
__init__.py
因此,在导入ex48
时从主文件夹中,它实际上最终会导入ex48
包。您可以通过在ex48_test.py
文件中执行以下操作来验证这一点 -
import ex48
print(ex48.__file__)
这应该导入__init__.py
文件夹中的ex48
文件。
解决方案是重命名您的文件夹,使其与您的ex48
模块不冲突。