1. 程式人生 > >Python 學習 第十五篇:模塊搜索路徑和包導入

Python 學習 第十五篇:模塊搜索路徑和包導入

部分 blank 所有 python 環境變量 bsp 引入 html pytho

在導入自定義的模塊時,除了指定模塊名之外,也需要指定目錄,由於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 學習 第十五篇:模塊搜索路徑和包導入