我正在尝试使用其中一个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}}目录层次结构?
答案 0 :(得分:6)
import foo.bar.baz
之类的导入语句首先导入foo
,然后请求bar
,然后向foo.bar
询问baz
。导入后,foo
是否能够满足bar
或bar.baz
的请求对于导入foo
并不重要。这只是一个模块。只有一个foo
模块。 import foo
和import foo.bar.baz
都会找到相同的模块 - 就像导入foo
模块的其他方式一样。
foo
实际上有一种方法是单个模块而不是包,并且仍然能够满足import foo.bar.baz
之类的语句:它可以添加"foo.bar"
和{ {1}}到"foo.bar.baz"
dict。这正是sys.modules
模块对os
的作用:它为平台导入正确的“路径”模块(os.path
,posixpath
,ntpath
等),并将其分配给os2path
属性。然后它path
使该模块可导入为sys.modules["os.path"] = path
,因此像os.path
这样的语句可以正常工作。没有理由这样做 - import os.path
可以在不导入的情况下使用 - 但这是可能的。