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