python中的包管理与导入

包中的__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。

相关文章
相关标签/搜索