淺析python 的import 模塊

模塊的搜索路徑

模塊的搜索路徑都放在了sys.path列表中,如果缺省的sys.path中沒有含有自己的模塊或包的路徑,可以動態的參加(sys.path.apend)即可。下面是sys.path在Windows平臺下的添加規矩 。

1、sys.path第一個路徑往往是主模塊所在的目錄。在交互環境下添加一個空項,它對該當 前目錄。

2、如果PYTHONPATH環境變量存在,sys.path會加載此變量指定的目錄。

3、我們嘗試找到Python Home,如果設置了PYTHONHOME環境變量,我們覺得 這就是Python Home,否則,我們應用 python.exe所在目錄找到lib\os.py去推斷Python Home。

如果我們確鑿 找到了Python Home,則相干 的子目錄(Lib、plat-win、lib-tk等)將以Python Home爲根基 參加 到sys.path,並導入(履行 )lib/site.py,將site-specific目錄及其下的包參加 。

如果我們沒有找到Python Home,則把註冊表Software\Python\PythonCore\2.5\PythonPath的項參加 sys.path(HKLM和 HKCU合併後參加 ),但相干 的子目錄不會主動 添加的。

4、如果我們沒有找到Python Home,並且沒有PYTHONPATH環境變量,並且不能在註冊表中找到PythonPath,那麼缺省相對路徑將參加 (如:.\Lib;. \plat-win等)。

總結如下:

當在安裝好的主目錄中運行Python.exe時,首先推斷Python Home,如果找到了PythonHome,註冊表中的PythonPath將被漠視 ;否則將註冊表的PythonPath參加 。

如果PYTHONPATH環境變量存在,sys.path確定 會加載此變量指定的目錄。

如果Python.exe在另外的一個目錄下(不同的目錄,比如通過COM嵌入到其他程序),Python Home將不推斷,此時註冊表的PythonPath將被應用 。

如果Python.exe不能創造他的主目錄(PythonHome),並且註冊表也沒有PythonPath,則將參加 缺省的相對目錄。

標準 Import

Python中所有加載到內存的模塊都放在sys.modules。當import一個模塊時首先會在這個列表中查找是否已經加載了此模塊,如果加 載了則只是將模塊的名字參加 到正在調用import的模塊的Local名字空間中。如果沒有加載則從sys.path目錄中遵守模塊名稱查找模塊文件,模 塊文件可以是py、pyc、pyd,找到後將模塊載入內存,並參加 到sys.modules中,並將名稱導入到當前的Local名字空間。

可以看出了,一個模塊不會重複 載入 。多個不同的模塊都可以用import引入同一個模塊到自己的Local名字 空間,其實背後的PyModuleObject對象只有一個。

說一個容易漠視 的問題,import只能導入模塊,不能導入模塊中的對象(類、函數、變量等)。 如一個模塊 A(A.py)中有個函數getName,另一個模塊不能通過import A.getName將getName導入到本模塊,只能用import A。如果想只導入特定的類、函數、變量則用from A import getName即可。

嵌套Import

嵌套import,我分兩種情況 ,一種是:本模塊導入A模塊(import A),而A中又有import語句,會激活另一個import動作,如import B,而B模塊又可以import其他模塊,一直下去。

對這種嵌套對比 容易瞭解,注意一點就是各個模塊的Local名字空間是獨立的,所以上面的例子,本模塊import A完了後本模塊只能造訪 模塊A,不能造訪 B及其他模塊。雖然模塊B已經加載到內存了,如果要造訪 還要在明確 的在本模塊中import B。

另外一種嵌套指,在模塊A中import B,而在模塊B中import A。這時會怎麼樣呢?這個在Python列表中由RobertChen給出了詳細解釋 ,抄寫 如下:

[A.py]
from B import D
class C:pass

[B.py]
from A import C
class D:pass

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章