有一些重要的误解需要解决,特别是术语方面。通常情况下,当你认为在Python中导入一个package
时,实际上你导入的是一个module
。当你从文件系统子结构角度考虑用于组织代码时,应该使用术语package
。但是从代码角度来看,每当你导入一个package
时,Python都将其视为一个模块。所有的包都是模块,但不是所有的模块都是包。带有__path__
属性的模块被认为是一个包。
你可以检查os
是一个模块。为了确认这一点,你可以执行以下操作:
import os
print(type(os)) # will print: <type 'module'>
在你的示例中,当你执行import FooPackage
时,FooPackage
也被视为模块,并且它的属性(函数、类等)应该在__init__.py
中定义。由于你的__init__.py
为空,它找不到foo
。
在import
语句之外,不能使用点表示法来寻址嵌套模块中的模块。唯一的例外是,如果一个module
被导入到了它所属的父包的__init__.py
文件中。为了清楚起见,让我们举几个例子:
考虑你的原始结构:
FooPackage/
__init__.py
foo.py
情况1:__init__.py是一个空文件
import FooPackage
FooPackage.foo
import FooPackage.foo
foo.anything
FooPackage.foo.anything
情况2:__init__.py文件中有import foo
代码行:
import FooPackage
FooPackage.foo
现在假设 foo
不再是一个模块,而是你在 __init__.py
中定义的一个函数。如果你执行 import FooPackage.foo
,它会抛出一个错误,指示 foo
不是一个模块。
__init__.py
文件中明确编写了子导入,否则你无法将包作为聚合体导入。 - Ben