位元組編譯 Python 庫


Python 是一種基於直譯器的語言。但是,當執行指令碼(.py 副檔名)時,它會在內部將原始碼編譯為位元組碼,然後自動刪除位元組碼版本。當第一次匯入模組(除了預編譯的內建模組)時,也會自動構建其編譯版本,但會以 .pyc 副檔名儲存在 __pycache__ 資料夾中。隨後再次呼叫匯入同一模組不會重新編譯模組,而是使用已構建的模組。

但是,可以顯式編譯具有 .py 副檔名的 Python 指令碼檔案,而無需執行它。**'py_compile'** 模組為此目的包含 **'compile()'** 函式。生成的 .pyc 檔案的名稱由 Python 的版本號附加。對於 Python 3.7,名稱具有 'cpython-37' 字尾。

通常不需要此模組。但是,在安裝供共享使用的模組時它可能很有用,尤其是一些使用者沒有許可權在包含原始碼的目錄中寫入位元組碼快取檔案。

該模組具有命令列介面。可以使用 –m 開關如下匯入它

E:\python37>python -m py_compile hello.py

這將在 __pycache__ 子資料夾中建立並存儲 'hello.cpython-37.pyc' 檔案。

位元組編譯也可以使用 py_compile 模組中的 compile() 函式以程式設計方式完成。

import py_compile
py_compile.compile("hello.py")

具有 .pyc 副檔名的位元組碼檔案可以直接從命令列執行,就像具有 .py 副檔名的普通指令碼一樣。

E:\python37>python __pycache__/hello.cpython-37.pyc

但是,它可以由與編譯位元組碼檔案相同的版本的直譯器執行。如果我們嘗試使用 Python 的任何其他版本執行它,則會顯示以下錯誤。

C:\python36>python e:hello.cpython-37.pyc
RuntimeError: Bad magic number in .pyc file

py_compile 模組還有另一個函式 main(),它編譯多個原始檔。名為引數的檔案被編譯,生成的位元組碼以正常方式快取。此函式不會搜尋目錄結構以查詢原始檔;它僅編譯顯式命名的檔案。

該模組還定義了 PyCompileError 異常,當嘗試編譯檔案時發生錯誤時會引發此異常。(僅當為 compile() 函式將 doraise 選項設定為 True 時才會引發此異常。)

compile() 函式的 optimize 選項控制最佳化級別,並傳遞給內建的 compile() 函式。-1 的預設值選擇當前直譯器的最佳化級別。

更新於:2019-07-30

778 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.