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

在導入自定義的模塊時,除了指定模塊名以外,也須要指定目錄,因爲Python把目錄稱做包,所以,這類導入被稱爲包導入。包導入把計算機上的目錄變成Python的命名空間,而目錄中所包含的子目錄和模塊文件則對應命名空間中的屬性。html

Python已經導入的模塊保存在一個內置的sys.modules字典中,以便記錄哪些模塊已經記錄了。python

一,模塊搜索路徑

導入過程首先須要定位導入文件的位置,也就是,告訴Python到何處去找到要導入的文件,所以,須要設置模塊的搜索路徑。在大多數狀況下,Python會自動到默認的目錄下去搜索模塊;若是要在默認的目錄以外導入模塊,就須要知道Pyhon搜索模塊路徑的機制。spa

Python搜索模塊的路徑是由四部分構成的:程序的主目錄、PATHONPATH目錄、標準連接庫目錄和.pth文件的目錄,這四部分的路徑都存儲在sys.path 列表中。.net

1,程序的主目錄code

主目錄是指包含程序的頂層腳本的目錄,Python首先會到主目錄中搜索模塊。htm

由於主目錄老是第一個被搜索,若是模塊徹底處於主目錄中,全部的導入都會自動完成,而不須要單獨配置路徑。對象

2,PATHONPATH目錄blog

PATHONPATH目錄是指PATHONPATH環境變量中配置的目錄,是第二個被搜索的目錄,Python會從左到右搜索PATHONPATH環境變量中設置的全部目錄。文檔

3,標準連接庫目錄get

標準連接庫目錄是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種方式

相關文章
相關標籤/搜索