當一個名為 spam 的子產品被導入的時候,解釋器首先尋找具有該名稱的内置子產品。如果沒有找到,然後解釋器從 sys.path 變量給出的目錄清單裡尋找名為 spam.py 的檔案。sys.path 初始有這些目錄位址:
包含輸入腳本的目錄(或者未指定檔案時的目前目錄)。
PYTHONPATH (一個包含目錄名稱的清單,它和shell變量 PATH 有一樣的文法)。
取決于安裝的預設設定
注解 在支援符号連結的檔案系統上,包含輸入腳本的目錄是在追加符号連結後才計算出來的。換句話說,包含符号連結的目錄并 沒有 被添加到子產品的搜尋路徑上。
在初始化後,
Python程式可以更改 sys.path。包含正在運作腳本的檔案目錄被放在搜尋路徑的開頭處, 在标準庫路徑之前。這意味着将加載此目錄裡的腳本,而不是标準庫中的同名子產品。 除非有意更換,否則這是錯誤。更多資訊請參閱
python标準子產品。
“編譯過的”Python檔案
為了加速子產品載入,Python在 pycache 目錄裡緩存了每個子產品的編譯後版本,名稱為 module.version.pyc ,其中名稱中的版本字段對編譯檔案的格式進行編碼; 它一般使用Python版本号。例如,在CPython版本3.3中,spam.py的編譯版本将被緩存為 __pycache__/spam.cpython-33.pyc。此命名約定允許來自不同發行版和不同版本的Python的已編譯子產品共存。
Python根據編譯版本檢查源的修改日期,以檢視它是否已過期并需要重新編譯。這是一個完全自動化的過程。此外,編譯的子產品與平台無關,是以可以在具有不同體系結構的系統之間共享相同的庫。
Python在兩種情況下不會檢查緩存。首先,對于從指令行直接載入的子產品,它從來都是重新編譯并且不存儲編譯結果;其次,如果沒有源子產品,它不會檢查緩存。為了支援無源檔案(僅編譯)發行版本, 編譯子產品必須是在源目錄下,并且絕對不能有源子產品。
給專業人士的一些小建議:
你可以在Python指令中使用 -O 或者 -OO 開關, 以減小編譯後子產品的大小。 -O 開關去除斷言語句,-OO 開關同時去除斷言語句和 doc 字元串。由于有些程式可能依賴于這些,你應當隻在清楚自己在做什麼時才使用這個選項。“優化過的”子產品有一個 opt- 标簽并且通常小些。将來的發行版本或許會更改優化的效果。
一個從 .pyc 檔案讀出的程式并不會比它從 .py 讀出時運作的更快,.pyc 檔案唯一快的地方在于載入速度。
compileall 子產品可以為一個目錄下的所有子產品建立.pyc檔案。
關于這個過程,PEP 3147 中有更多細節,包括一個決策流程圖。