py_compile --- 編譯 Python 源文件?
源代碼: Lib/py_compile.py
py_compile 模塊提供了用來從源文件生成字節(jié)碼的函數(shù)和另一個(gè)用于當(dāng)模塊源文件作為腳本被調(diào)用時(shí)的函數(shù)。
雖然不太常用,但這個(gè)函數(shù)在安裝共享模塊時(shí)還是很有用的,特別是當(dāng)一些用戶可能沒有權(quán)限在包含源代碼的目錄中寫字節(jié)碼緩存文件時(shí)。
-
exception
py_compile.PyCompileError? 當(dāng)編譯文件過程中發(fā)生錯(cuò)誤時(shí),拋出的異常。
-
py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP)? 將源文件編譯成字節(jié)碼,并寫出字節(jié)碼緩存文件。源代碼從名為 file 的文件中加載。 字節(jié)碼寫入 cfile ,默認(rèn)為 PEP 3147/PEP 488 路徑,以
.pyc結(jié)尾。例如,如果 file 是/foo/bar/baz.py,那么對(duì)于 Python 3.2,cfile 默認(rèn)為/foo/bar/__pycache__/baz.cpython-32.pyc。 如果指定了 dfile ,那么在錯(cuò)誤信息中,它將代替 file 作為源文件的名稱。 如果 doraise 為true,當(dāng)編譯 file 遇到錯(cuò)誤時(shí),會(huì)拋出一個(gè)PyCompileError。如果 doraise 為 false (默認(rèn)值),錯(cuò)誤字符串將寫入sys.stderr,但不會(huì)拋出異常。 該函數(shù)返回編譯后字節(jié)文件的路徑,即 cfile 的值。如果 cfile 所表示(顯式指定或計(jì)算得出)的路徑為符號(hào)鏈接或非常規(guī)文件,則將引發(fā)
FileExistsError。 此行為是用來警告如果允許寫入編譯后字節(jié)碼文件到這些路徑則導(dǎo)入操作將會(huì)把它們轉(zhuǎn)為常規(guī)文件。 這是使用文件重命名來將最終編譯后字節(jié)碼文件放置到位以防止并發(fā)文件寫入問題的導(dǎo)入操作的附帶效果。optimize 控制優(yōu)化級(jí)別并會(huì)被傳給內(nèi)置的
compile()函數(shù)。 默認(rèn)值-1表示選擇當(dāng)前解釋器的優(yōu)化級(jí)別。invalidation_mode 應(yīng)當(dāng)是
PycInvalidationMode枚舉的成員,它控制在運(yùn)行時(shí)如何讓已生成的字節(jié)碼緩存失效。 如果設(shè)置了SOURCE_DATE_EPOCH環(huán)境變量則默認(rèn)值為PycInvalidationMode.CHECKED_HASH,否則默認(rèn)值為PycInvalidationMode.TIMESTAMP。在 3.2 版更改: 將 cfile 的默認(rèn)值改成與 PEP 3147 兼容。 之前的默認(rèn)值是 file +
'c'(如果啟用優(yōu)化則為'o')。 同時(shí)也添加了 optimize 形參。在 3.4 版更改: 將代碼更改為使用
importlib執(zhí)行字節(jié)碼緩存文件寫入。 這意味著文件創(chuàng)建/寫入的語義現(xiàn)在與importlib所做的相匹配,例如權(quán)限、寫入和移動(dòng)語義等等。 同時(shí)也添加了當(dāng) cfile 為符號(hào)鏈接或非常規(guī)文件時(shí)引發(fā)FileExistsError的預(yù)警設(shè)置。在 3.7 版更改: invalidation_mode 形參是根據(jù) PEP 552 的描述添加的。 如果設(shè)置了
SOURCE_DATE_EPOCH環(huán)境變量,invalidation_mode 將被強(qiáng)制設(shè)為PycInvalidationMode.CHECKED_HASH。在 3.7.2 版更改:
SOURCE_DATE_EPOCH環(huán)境變量不會(huì)再覆蓋 invalidation_mode 參數(shù)的值,而改為確定其默認(rèn)值。
-
class
py_compile.PycInvalidationMode? 一個(gè)由可用方法組成的枚舉,解釋器可以用來確定字節(jié)碼文件是否與源文件保持一致。
.pyc文件在其標(biāo)頭中指明了所需的失效模式。 請(qǐng)參閱 已緩存字節(jié)碼的失效 了解有關(guān) Python 在運(yùn)行時(shí)如何讓.pyc文件失效的更多信息。3.7 新版功能.
-
TIMESTAMP? .pyc文件包括時(shí)間戳和源文件的大小,Python 將在運(yùn)行時(shí)將其與源文件的元數(shù)據(jù)進(jìn)行比較以確定.pyc文件是否需要重新生成。
-
CHECKED_HASH? .pyc文件包括源文件內(nèi)容的哈希值,Python 將在運(yùn)行時(shí)將其與源文件內(nèi)容進(jìn)行比較以確定.pyc文件是否需要重新生成。
-
UNCHECKED_HASH? 類似于
CHECKED_HASH,.pyc文件包括源文件內(nèi)容的哈希值。 但是,Python 將在運(yùn)行時(shí)假定.pyc文件是最新的而完全不會(huì)將.pyc與源文件進(jìn)行驗(yàn)證。此選項(xiàng)適用于
.pycs由 Python 以外的某個(gè)系統(tǒng)例如構(gòu)建系統(tǒng)來確保最新的情況。
-
-
py_compile.main(args=None)? 編譯多個(gè)源文件。 在 args 中(或者當(dāng) args 為
None時(shí)則是在命令行中)指定的文件會(huì)被編譯并將結(jié)果字節(jié)碼以正常方式來緩存。 此函數(shù)不會(huì)搜索目錄結(jié)構(gòu)來定位源文件;它只編譯顯式指定的文件。 如果'-'是 args 中唯一的值,則會(huì)從標(biāo)準(zhǔn)輸入獲取文件列表。在 3.2 版更改: 添加了對(duì)
'-'的支持。
當(dāng)此模塊作為腳本運(yùn)行時(shí),會(huì)使用 main() 來編譯命令行中指定的所有文件。 如果某個(gè)文件無法被編譯則退出狀態(tài)將為非零值。
參見
- 模塊
compileall 編譯一個(gè)目錄樹中所有 Python 源文件的工具。
