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

bra*_*jam 2 python import

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

所以我开始写一个小脚本

import foo.bar.baz
Run Code Online (Sandbox Code Playgroud)

并保存为foo.py.

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

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

Tho*_*ers 6

就像一个import语句import foo.bar.baz先进口foo,然后要求它bar,然后问foo.barbaz.无论是foo意志,一旦进口的,能够满足该请求bar或者bar.baz是不重要的进口foo.这只是一个模块.只有一个foo模块.双方import fooimport foo.bar.baz会发现同样的模块-就像导入任何其他方式foo模块.

其实还有一种方法foo是一个单独的模块,而不是一个包,仍然能够满足像声明import foo.bar.baz:它可以增加"foo.bar""foo.bar.baz"sys.modules字典.这也正是什么os模块做与os.path:它导入正确的"路径"模块为平台(posixpath,ntpath,os2path等),并将其分配给path属性.然后它确实sys.modules["os.path"] = path使该模块可导入os.path,所以一个声明就像import os.path工作一样.没有理由这样做 - os.path没有导入也可以 - 但它是可能的.