我正在尝试一个 Python 标准库模块,我们将其命名为 foo.bar.baz
。
所以我写了一个小脚本,开头为
import foo.bar.baz
并将其保存为foo.py
。
当我执行脚本时,我收到了导入错误。我花了一段时间(我还在学习Python),但我终于意识到问题出在我如何命名脚本上。一旦我将 foo.py 重命名为其他名称,问题就消失了。
所以我知道 import foo
语句将在查找标准库 foo
之前查找脚本 foo.py
,但它是当我说 import foo.bar.baz
时,我不清楚它在寻找什么。有什么方法可以使 foo.py 的内容有意义吗?如果不是,为什么 Python 解释器不继续寻找具有适当 __init__.py
的目录层次结构,例如 foo/bar
?。
最佳答案
像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"
和 "foo.bar.baz"
添加到 sys.modules
字典中。这正是 os.path 模块所做的:它为平台导入正确的“路径”模块(posixpath, >ntpath
、os2path
等),并将其分配给 path
属性。然后它执行 sys.modules["os.path"] = path 以使该模块可作为 os.path 导入,因此像 import os.path 这样的语句
有效。确实没有理由这样做 - os.path
无需导入即可使用 - 但这是可能的。
关于python - 为什么当上层与当前目录中的模块匹配时,导入点分模块名称会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846821/