包中的__init__.py文件
1、python的每个模块的包中,包含一个__init__.py文件,有了这个文件,才能导入目录下的module。
2、__init__.py为空时,使用from xxx import *从该包导入时,虽然正常工作,但是没有导入任何内容。
3、可以在__init__.py中导入其它包或模块,这样当引入该包时,__init__.py运行,自动导入这些模块。
如__init__.py内容为:
import aa
import bb
使用时,from xxx import *,将自动导入aa和bb。
4、__init__.py中有一个特殊变量__all__,定义一个列表,当使用from xxx import *时,将自动导入所有__all__中列出的子包或子模块。
如:__all__ = ['cc','dd']
from xxx import *将自动导入cc和dd。
import格式
1、import xxx /import packagename.xxx /import package1.package2.xxx
每级package目录中都需要__init__.py。
3、from packagename import xxx/from package1.package2 import xxx
4、from packagename import */from package1.package2 import *
*只用放在有from的导入的import后面。
import */from package1 import package2.*,格式都是不正确的。
绝对路径与相对路径
1、absolute import
相对于sys.path中定义的路径。
2、relative import
import xxx/import package1.xxx
从语句上,看不出来是sys.path下的模块,还是当前包下的模块。relative import不建议使用。
可以在文件中加入from __future__ import absolute_import禁止relative import。这样会认为import xxx/import package1.xxx都是absolute import,相对于sys.path中的路径。
3、explicit relative import
from . import xxx/from .package1 import xxx/from ..package1 import xxx
用一个点表示当前package中进行查找,两个点表示上一层package中进行查找。
注意事项:
python中只能在模块中使用relative import,而不能在应用程序中使用relative import。应用程序必需使用absolute import,而package中可以使用相对导入。
explicit relative import 使用模块的名字确定模块在包中的位置,入口文件模块名字总是__main__。在package中使用relative import时,一定不能引用到入口文件所在的那一层目录。
如:
main.py
|___________core
| |____________sunny.py
| |____________ __init__.py
|___________effect
| |____________windy.py
| |____________ __init__.py
|________________________ __init__.py
在sunny.py中使用from ..effect import windy,因为 .. 运算符进入上一层的package, 然后发现入口文件就在这一层,所以不会把这一层当作一个package, 这样就会出现 下面的错误:
ValueError: Attempted relative import beyond toplevel package。