匯入套件


如果你在dir1目錄中有有個名為mod的模組檔案,而dir2中也有個名為mod的模組檔案。若sys.path中包括dir1與dir2。如果現在你的應用程式中,撰寫了以下的程式:
import mod
...

那麼,會匯入的僅有dir1/mod模組檔案。模組檔案的尋找,是以sys.path中的路徑,先找到符合的名稱就使用。

如果要同時使用到dir1/mod.py與dir2/mod.py,那麼單純僅使用sys.path來尋找模組無法達到這個目的。同名模組的名稱衝突問題,可以藉由套件(Package)的使用來解決。在Python中,套件的實體結構就是目錄,而每個套件目錄中必須放置一個__init__.py檔案。例如:
[sys.path 之一]
              |
              [dir1]

              |    |__init__.py
              |    |mod.py
              |    |helper.py
              |    [subdir1]
              |            |__init__.py
              |            |ooo.py
              [dir2]
                   |__init__.py
                   |mod.py

每個套件資料夾都要有一個__init__.py。在上面的例子中,若要在程式中使用dir1/mod.py模組檔案,則可以:
import dir1.mod
print(dir1.mod.name)

在上例中,假設mod中有個name變數,則要取用該變數,則是透過「套件.模組.變數」的方式來取得,透過套件階層的安排,可以為模組分門別類,在程式中則使用「套件.模組」的方式來減少名稱衝突的問題,而若要檢閱模組,套件階層也有助於尋找出模組檔案的正確位置。

若遇到套件階層名稱較長,例如cc.openhome.web.mvc.xxxmodel這樣名稱,在程式中撰寫冗長,則可以透過import as來讓程式便於撰寫。例如:
import cc.openhome.web.mvc.xxxmodel as xxxmodel
xxxmodel.dosome()

或者是透過from import在目前模組中建立想要存取的變數名稱即可。例如:
from cc.openhome.web.mvc.xxxmodel import dosome
dosome()

在Python中,如果為同一套件中的模組檔案,無需時完整import語法來匯入模組,而可以透過相對匯入語法來彼此匯入。例如:
from .helper import func1
func1()

注意,在上面的from語句後面的模組名稱前有個 . ,這表示相對匯入同一套件中的helper.py模組檔案,從而避免了必須從sys.path中尋找,以及在同一套件中模組彼此引用的語法冗長。

每個套件目錄中都必須有個__init__.py,當你匯入套件時,該套件目錄中的__init__.py也會被執行,你可以在其中作一些匯入套件時所必須進行的初始化動作。