【Python學習】python學習手冊--第二十一章 模塊:宏偉藍圖

從實際應用角度來看,模塊實際上對應於Python程序文件,每一個文件都是一個模塊,並且模塊導入其他模塊模塊之後就可以使用該模塊中定義的變量名和函數。模塊基本上可以由兩個語句和一個重要的內置函數進行處理:

  • import,可以導入整個模塊內容
  • from 從模塊中選取要導入的對象
  • imp.reload 在不終止Python程序的情況下,重新導入模塊。

從抽象的視角來看,模塊至少有三個角色:

  • 代碼重用。模塊中的代碼可以被多次導入其它模塊。
  • 系統命名空間的劃分。模塊中的變量或對象都存在於模塊中,命名空間也封裝於模塊中。不同模塊之間的可以有效避免衝突。
  • 實現共享服務和數據

在Python中,頂層文件(也叫腳本)主要包括了處理的主要流程,它常常導入了一個或多個其他模塊的內容。這些模塊提供特定的功能,導入模塊後,就可以在頂層文件中獲得該模塊內容的訪問權和使用權。
這裏寫圖片描述

標準庫模塊是Python自帶的一些常用模塊,可以在任何安裝了python的情況下使用。

import如何工作

  1. 找到模塊文件
  2. 編譯成位碼(需要時執行)
  3. 執行模塊的代碼來創建其所定義的對象

這三個步驟是在程序第一次執行模塊導入時纔會進行。當導入相同模塊時,會跳過這三個步驟,而只是提取內存中已加載的模塊對象。從技術上講,當執行模塊導入時會檢查sys.modules的表,如果表中沒有要導入的模塊則開始執行導入,如果表中不存在,將會按照這三個步驟開始執行模塊導入。

搜索

當第一次導入一個模塊時,Python程序要按照一定的路徑順序查找模塊。Python程序會按照以下4個路徑順序來查找模塊

  • 程序主目錄
    該路徑是Python程序是自動定義的。當運行一個頂層文件時,主目錄就是包含該頂層文件的目錄。這個目錄是Python程序最先查找的目錄,意味着這裏的模塊可能覆蓋後面路徑中(包括標準庫中)同文件名的模塊。
  • PYTHONPATH目錄(如果已經設置)
    Python會從左至右搜索PYTHONPATH環境變量中的路徑,這些目錄是可以是平臺用戶自定義的。可以用這種方式來擴展自己的Python路徑
  • 標準鏈接庫目錄
    Python程序會自動搜索安裝在機器上的Python目錄
  • 任何.path文件的內容(如果文件存在)
    允許用戶將路徑一行行列在文本文件中,將該文本放在適當的目錄下。Python程序也會讀取文本文件中的內容,將目錄添加到搜索路徑中。文本文件可以放在安裝目錄的頂層,或者在標準庫所在位置的目錄下。在linux路徑下,可能是在/usr/local/lib/python3.5/dist-packages下

從技術上講,Python將這四個路徑組合成爲一個包含路徑的列表(sys.path),並按按照先後順序來依次搜索當中的模塊。也可以通過打印sys.path來顯示當前搜索的所有路徑。也可以通過修改sys.path變量來改變搜索路徑,當然這個修改只能在Python程序運行時有效,程序退出後失效。

模塊文件選擇

Python程序會在搜索的路徑中,按照下面的順序找到第一個符合模塊名稱的文件:

  • 源代碼文件 .py
  • 字節碼文件.pyc
  • 目錄,包導入
  • 編譯擴展模塊,導入時動態鏈接
  • 用c編寫的編譯好的內置模塊,並通過靜態鏈接至Python
  • ZIP文件組件,導入時會自動解壓
  • 內存映像文件,對於frozen可執行文件
  • Java類,在Jypthon版本的Python
  • .NET組件,在IronPython版本的Python

正常情況下,不要讓Python程序去按照上述順序來判斷導入的模塊,在編程時,應該讓模塊文件名稱更明顯更特殊一些。

高級的模塊選擇概念

一般來說,導入模塊的工作就是按照上面的步驟來執行的。在Python中重新定義import也是有可能的,這可以讓Python程序在默認導入一個模塊時,執行某一些鉤子腳本,比如解密,歸檔等操作。更多細節可以參考Python標準庫手冊中關於內置的__import__函數的說明,這個函數是實際執行的import語句的可定製工具

小結

import和from語句是Python模塊導入的核心,在導入時,先從預定的搜索路徑中搜索模塊名。模塊是爲python程序提供結構,讓程序將其邏輯分割成爲一些獨立完備的軟件組件。一個模塊與另一個模塊完全獨立和分離,在不使用import的情況下,是不能相互訪問的。

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