包中的__init__.py文件python
一、python的每一个模块的包中,包含一个__init__.py文件,有了这个文件,才能导入目录下的module。
spa
二、__init__.py为空时,使用from xxx import *从该包导入时,虽然正常工做,可是没有导入任何内容。ci
三、能够在__init__.py中导入其它包或模块,这样当引入该包时,__init__.py运行,自动导入这些模块。it
如__init__.py内容为:
import
import aa
变量
import bb
module
使用时,from xxx import *,将自动导入aa和bb。引用
四、__init__.py中有一个特殊变量__all__,定义一个列表,当使用from xxx import *时,将自动导入全部__all__中列出的子包或子模块。程序
如:__all__ = ['cc','dd']im
from xxx import *将自动导入cc和dd。
import格式
一、import xxx /import packagename.xxx /import package1.package2.xxx
每级package目录中都须要__init__.py。
三、from packagename import xxx/from package1.package2 import xxx
四、from packagename import */from package1.package2 import *
*只用放在有from的导入的import后面。
import */from package1 import package2.*,格式都是不正确的。
绝对路径与相对路径
一、absolute import
相对于sys.path中定义的路径。
二、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中的路径。
三、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。