我正在尝试一个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的?一样的目录层次结构.
就像一个import语句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模块做与os.path:它导入正确的"路径"模块为平台(posixpath,ntpath,os2path等),并将其分配给path属性.然后它确实sys.modules["os.path"] = path使该模块可导入os.path,所以一个声明就像import os.path工作一样.没有理由这样做 - os.path没有导入也可以 - 但它是可能的.