有一些重要的误解需要解决,特别是用术语。首先,通常,当您认为要package
在python中导入时,实际上要导入的是module
。package
在考虑有助于您组织代码的文件系统子结构时,应使用该术语。但从代码角度来看,每当导入时package
,Python会将其视为模块。所有软件包都是模块。并非所有模块都是软件包。具有该__path__
属性的模块被视为包。
您可以检查这os
是一个模块。要确认这一点,您可以执行以下操作:
import os
print(type(os))
在您的示例中,当您执行时import FooPackage
,FooPackage
也会被视为模块,并且其属性(函数,类等)也应该在中定义__init__.py
。由于您__init__.py
为空,因此找不到foo
。
在import
语句之外,您不能使用'.'
符号来寻址模块内部的模块。如果将amodule
导入到预期的父级的包__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不再是您在中定义的a module
,而是a 。如果这样做,将抛出错误,指出不是模块。function
__init__.py
import FooPackage.foo
foo