当上层与当前目录中的模块匹配时,为什么导入虚线模块名称会失败?

时间:2010-10-02 17:36:39

标签: python import

我正在尝试使用其中一个Python标准库模块,我们称之为foo.bar.baz

所以我写了一个以

开头的小脚本
import foo.bar.baz

并将其保存为foo.py

当我执行脚本时,我得到了一个ImportError。我花了一段时间(我还在学习Python),但我终于意识到问题是我如何命名脚本。一旦我将foo.py重命名为其他内容,问题就会消失。

所以我理解import foo语句会在查找标准库foo.py之前查找脚本foo,但我不清楚我说的是什么import foo.bar.baz。是否有某种方式foo.py可以使该陈述的内容有意义?如果没有,为什么Python解释器不会继续寻找具有相应foo/bar的{​​{1}}目录层次结构?

1 个答案:

答案 0 :(得分:6)

import foo.bar.baz之类的导入语句首先导入foo,然后请求bar,然后向foo.bar询问baz。导入后,foo是否能够满足barbar.baz的请求对于导入foo并不重要。这只是一个模块。只有一个foo模块。 import fooimport foo.bar.baz都会找到相同的模块 - 就像导入foo模块的其他方式一样。

foo实际上有一种方法是单个模块而不是包,并且仍然能够满足import foo.bar.baz之类的语句:它可以添加"foo.bar"和{ {1}}到"foo.bar.baz" dict。这正是sys.modules模块对os的作用:它为平台导入正确的“路径”模块(os.pathposixpathntpath等),并将其分配给os2path属性。然后它path使该模块可导入为sys.modules["os.path"] = path,因此像os.path这样的语句可以正常工作。没有理由这样做 - import os.path可以在不导入的情况下使用 - 但这是可能的。