py_compile --- 編譯 Python 源文件?

源代碼: Lib/py_compile.py


py_compile 模塊提供了用來從源文件生成字節碼的函數和另一個用于當模塊源文件作為腳本被調用時的函數。

雖然不太常用,但這個函數在安裝共享模塊時還是很有用的,特別是當一些用戶可能沒有權限在包含源代碼的目錄中寫字節碼緩存文件時。

exception py_compile.PyCompileError?

當編譯文件過程中發生錯誤時,拋出的異常。

py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP)?

將源文件編譯成字節碼,并寫出字節碼緩存文件。源代碼從名為 file 的文件中加載。 字節碼寫入 cfile ,默認為 PEP 3147/PEP 488 路徑,以 .pyc 結尾。例如,如果 file/foo/bar/baz.py ,那么對于 Python 3.2,cfile 默認為 /foo/bar/__pycache__/baz.cpython-32.pyc 。 如果指定了 dfile ,那么在錯誤信息中,它將代替 file 作為源文件的名稱。 如果 doraise 為true,當編譯 file 遇到錯誤時,會拋出一個 PyCompileError 。如果 doraise 為 false (默認值),錯誤字符串將寫入 sys.stderr ,但不會拋出異常。 該函數返回編譯后字節文件的路徑,即 cfile 的值。

如果 cfile 所表示(顯式指定或計算得出)的路徑為符號鏈接或非常規文件,則將引發 FileExistsError。 此行為是用來警告如果允許寫入編譯后字節碼文件到這些路徑則導入操作將會把它們轉為常規文件。 這是使用文件重命名來將最終編譯后字節碼文件放置到位以防止并發文件寫入問題的導入操作的附帶效果。

optimize 控制優化級別并會被傳給內置的 compile() 函數。 默認值 -1 表示選擇當前解釋器的優化級別。

invalidation_mode 應當是 PycInvalidationMode 枚舉的成員,它控制在運行時如何讓已生成的字節碼緩存失效。 如果設置了 SOURCE_DATE_EPOCH 環境變量則默認值為 PycInvalidationMode.CHECKED_HASH,否則默認值為 PycInvalidationMode.TIMESTAMP

在 3.2 版更改: cfile 的默認值改成與 PEP 3147 兼容。 之前的默認值是 file + 'c' (如果啟用優化則為 'o')。 同時也添加了 optimize 形參。

在 3.4 版更改: 將代碼更改為使用 importlib 執行字節碼緩存文件寫入。 這意味著文件創建/寫入的語義現在與 importlib 所做的相匹配,例如權限、寫入和移動語義等等。 同時也添加了當 cfile 為符號鏈接或非常規文件時引發 FileExistsError 的預警設置。

在 3.7 版更改: invalidation_mode 形參是根據 PEP 552 的描述添加的。 如果設置了 SOURCE_DATE_EPOCH 環境變量,invalidation_mode 將被強制設為 PycInvalidationMode.CHECKED_HASH

在 3.7.2 版更改: SOURCE_DATE_EPOCH 環境變量不會再覆蓋 invalidation_mode 參數的值,而改為確定其默認值。

class py_compile.PycInvalidationMode?

一個由可用方法組成的枚舉,解釋器可以用來確定字節碼文件是否與源文件保持一致。 .pyc 文件在其標頭中指明了所需的失效模式。 請參閱 已緩存字節碼的失效 了解有關 Python 在運行時如何讓 .pyc 文件失效的更多信息。

3.7 新版功能.

TIMESTAMP?

.pyc 文件包括時間戳和源文件的大小,Python 將在運行時將其與源文件的元數據進行比較以確定 .pyc 文件是否需要重新生成。

CHECKED_HASH?

.pyc 文件包括源文件內容的哈希值,Python 將在運行時將其與源文件內容進行比較以確定 .pyc 文件是否需要重新生成。

UNCHECKED_HASH?

類似于 CHECKED_HASH.pyc 文件包括源文件內容的哈希值。 但是,Python 將在運行時假定 .pyc 文件是最新的而完全不會將 .pyc 與源文件進行驗證。

此選項適用于 .pycs 由 Python 以外的某個系統例如構建系統來確保最新的情況。

py_compile.main(args=None)?

編譯多個源文件。 在 args 中(或者當 argsNone 時則是在命令行中)指定的文件會被編譯并將結果字節碼以正常方式來緩存。 此函數不會搜索目錄結構來定位源文件;它只編譯顯式指定的文件。 如果 '-' 是 args 中唯一的值,則會從標準輸入獲取文件列表。

在 3.2 版更改: 添加了對 '-' 的支持。

當此模塊作為腳本運行時,會使用 main() 來編譯命令行中指定的所有文件。 如果某個文件無法被編譯則退出狀態將為非零值。

參見

模塊 compileall

編譯一個目錄樹中所有 Python 源文件的工具。