Python 學習 第十五篇:模塊搜索路徑和包導入
在導入自定義的模塊時,除了指定模塊名之外,也需要指定目錄,由於Python把目錄稱作包,因此,這類導入被稱為包導入。包導入把計算機上的目錄變成Python的命名空間,而目錄中所包含的子目錄和模塊文件則對應命名空間中的屬性。
Python已經導入的模塊保存在一個內置的sys.modules字典中,以便記錄哪些模塊已經記錄了。
一,模塊搜索路徑
導入過程首先需要定位導入文件的位置,也就是,告訴Python到何處去找到要導入的文件,因此,需要設置模塊的搜索路徑。在大多數情況下,Python會自動到默認的目錄下去搜索模塊;如果要在默認的目錄之外導入模塊,就需要知道Pyhon搜索模塊路徑的機制。
Python搜索模塊的路徑是由四部分構成的:程序的主目錄、PATHONPATH目錄、標準鏈接庫目錄和.pth文件的目錄,這四部分的路徑都存儲在sys.path 列表中。
1,程序的主目錄
主目錄是指包含程序的頂層腳本的目錄,Python首先會到主目錄中搜索模塊。
因為主目錄總是第一個被搜索,如果模塊完全處於主目錄中,所有的導入都會自動完成,而不需要單獨配置路徑。
2,PATHONPATH目錄
PATHONPATH目錄是指PATHONPATH環境變量中配置的目錄,是第二個被搜索的目錄,Python會從左到右搜索PATHONPATH環境變量中設置的所有目錄。
3,標準鏈接庫目錄
標準鏈接庫目錄是Python按照標準模塊的目錄,是在安裝Python時自動創建的目錄,通常不需要添加到PYTHONPATH目錄中。
4,路徑文件(.pth文件)
在模塊搜索目錄中,創建路徑文件,後綴名為.pth,該文件每一行都是一個有效的目錄。Python會讀取路徑文件中的內容,每行都作為一個有效的目錄,加載到模塊搜索路徑列表中。簡而言之,當路徑文件存放到搜索路徑中時,其作用和PYT)HONPATH環境變量的作用相同。
如果運行在Windows和Python3.0中,如果Python安裝目錄的頂層是C:\Python30,那麽可以把自定義的路徑文件 mypath.pth 放到該目錄中。
也可以放到標準庫所在位置的sitepackages子目錄中(C:\Python30\Lib\sitepackages),來擴展模塊的搜搜路徑。
二,配置搜索路徑
上述四種模塊搜索路徑,能夠配置的選項只有PYTHONPATH環境變量和路徑文件。例如,在Windows平臺上,創建PYTHONPATH環境變量,設置變量的值,兩個目錄使用分號隔開:
C:\pycode\utilities;D:\pycode\package1
也可以創建一個名為 C:\Python30\pydirs.pth的文本文件,其內容如下所示:
C:\pycode\utilities
D:\pycode\package1
三,sys.path列表
如果想看模塊搜索路徑在機器上的實際配置,可以通過打印內置的sys.path列表來查看,這個列表是sys模塊的path屬性。
import sys print(sys.path)
其實,sys.path是模塊搜索的路徑,Pytho在程序啟動時進行配置,自動把頂級文件的主目錄,PYTHONPATH環境變量中配置的目錄,.pth文件中目錄以及標準連接庫目錄加載到sys.path列表中,Python每次導入一個新的模塊,都是從sys.path列表中查找搜索目錄。
四,包導入基礎
搜索路徑是指Python搜索模塊的路徑前綴,在import 語句的路徑上添加這些路徑,以構成模塊的絕對路徑。通常把存儲模塊的根目錄稱作容器目錄,記作dir0,容器目錄dir0必須包含在搜搜路徑中。
例如,在dir0目錄下,存在dri1/dir2/mod.py模塊,那麽導入該模塊需要設置搜索路徑為dir0,並使用import 和路徑導入該模塊:
import dir1.dir2.mod
from dir1.dir2.mod import mod_fun
在import語句中列舉目錄名,以點號分隔,"."路徑是對應於dir0內的目錄,通過這個目錄可以找到mod.py模塊。
五,__init__.py包文件
如果選擇使用包導入,就必須多遵循一條約束:包導入語句的路徑中,每個目錄內都必須有__init__.py文件,否則包導入失敗。
對於目錄結構 dir0/dri1/dir2/mod.py
import dir1.dir2.mod
必須遵守以下規則:
- dir0是容器目錄,不需要__init__.py文件,如果有,也會被忽略。
- dir0必須列在模塊搜索路徑列表中,也就是說,dir0必須是主目錄,或者列在PYTHONPATH環境變量中等。
- dir1和dir2都必須包含一個__init__.py文件
__init__.py文件是當 import 第一次遍歷一個包目錄時所運行的文件,可以包含Python程序代碼,也可以完全是空的。通常情況下,__init__.py文件扮演了包初始化的鉤子,替目錄產生模塊命名空間以及使用目錄導入時實現from*行為的角色。
1,包的初始化
Python在首先導入某個目錄時,會自動執行該目錄下的__init__.py文件中的所有程序代碼。
2,模塊命名空間的初始化
在包導入模型中,腳本內的目錄路徑,在導入後會變成真實的對象路徑,即,為目錄創建的模塊對象提供了命名空間。
3,from *語句的行為
在__init__.py文件內使用__all__列表,來定義目錄以from * 語句形式導入時,需要導出的屬性清單。如果沒有設置__all__,from *語句不會自動加載潛逃與該目錄內的子模塊,也就是說,只加載該目錄下的__init__.py文件中羅列在__all__列表中的變量。
參考文檔:
python引入導入自定義模塊和外部文件
Python3導入自定義模塊的3種方式
Python 學習 第十五篇:模塊搜索路徑和包導入