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

标签 python import

我正在尝试一个 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 代表 bazfoo 一旦导入后是否能够满足 barbar.baz 的请求对于 foo 的导入并不重要。它只是一个模块。只有一个 foo 模块。 import fooimport foo.bar.baz 都会找到相同的模块——就像导入 foo 模块的任何其他方式一样。

实际上有一种方法可以让 foo 成为单个模块,而不是一个包,并且仍然能够满足像 import foo.bar.baz 这样的语句:它可以将 "foo.bar""foo.bar.baz" 添加到 sys.modules 字典中。这正是 os.path 模块所做的:它为平台导入正确的“路径”模块(posixpath, >ntpathos2path 等),并将其分配给 path 属性。然后它执行 sys.modules["os.path"] = path 以使该模块可作为 os.path 导入,因此像 import os.path 这样的语句 有效。确实没有理由这样做 - os.path 无需导入即可使用 - 但这是可能的。

关于python - 为什么当上层与当前目录中的模块匹配时,导入点分模块名称会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846821/

相关文章:

python - 如何使用 Unicode 编码创建临时文件?

python - 有没有办法将仅包含一个元素的列表与列表的所有其他元素组合起来?

python - 为什么 Twisted 的 adbapi 无法从单元测试中恢复数据?

python - 在 python 中使用 csv.DictWriter 写入 csv 时添加列(带有值)

python - 如何让 python 在终端中调用模块后立即导入该模块?

JavaScript:从导入的文件导入文件

python - Django 模板 - 列表迭代

java - 不支持的方法的有用性:BaseConfig.getApplicationIdSuffix()

android - 为什么我不能将现有项目导入 Eclipse?

java - 方法中无法识别 JSoup 导入