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。

相關文章
相關標籤/搜索