編譯python源代碼
使用py_compile庫。
PyCompileError
嘗試編譯文件時發生錯誤時引發異常。
py_compile.PyCompileError
compile
壓縮后的pyc文件默認保存在文件所在目錄下的__pycache__目錄下。
py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0)
參數描述:
file:python的源代碼文件
cfile:
dfile:如果指定了 dfile,則它用作錯誤消息中的源文件的名稱
doraise:如果doraise為 true,則在編譯文件時遇到錯誤時引發PyCompileError 。 如果doraise為 false(默認值),則將錯誤字符串寫入文件 ,但不會引發異常。
optimize:最優化控制最優化級別,並傳遞給內置的compile()函數。 缺省值為選擇當前解釋器的優化級別。-1
invalidation_mode:是PycInvalidationMode枚舉的成員,並控制如何在運行時使生成的字節碼緩存無效。 如果設置了環境變量,則默認值為PycInvalidationMode.CHECKED_HASH,否則默認值為PycInvalidationMode.TIMESTAMP.SOURCE_DATE_EPOCH
PycInvalidationMode
解釋器可以用來確定字節碼文件是否與源文件最新的方法的枚舉。
-
TIMESTAMP該文件包括源文件的時間戳和大小,Python 將在運行時與源文件的元數據進行比較,以確定是否需要重新生成該文件。
.pyc -
CHECKED_HASH該文件包括源文件內容的哈希值,Python 將在運行時與源進行比較,以確定是否需要重新生成該文件。
.pyc -
UNCHECKED_HASH與
CHECKED_HASH一樣,該文件包括源文件內容的哈希。但是,Python 將在運行時假定該文件是最新的,並且不會根據源文件驗證 。.pyc當 Python 外部某些系統(如生成系統)保持最新時,此選項很有用。.pycs
main
py_compile.main(args=None)
編譯幾個源文件。 編譯以args命名的文件(如果args是,則在命令行上),然后以常規方式緩存生成的字節碼。 該功能不會搜索目錄結構來查找源文件; 它僅編譯顯式命名的文件。 如果是args中的唯一參數,則文件列表取自標准輸入。
命令行簡單編譯單個文件
python -m py_compile test.py
編譯所有文件
官網:https://docs.python.org/3/library/compileall.html#module-compileall
在命令行中使用compileall
如下使用示例:
$ python -m compileall -h
命令行參數
-r:控制子目錄的最大遞歸級別。 如果給出此選項,則不會考慮該選項。
python -m compileall <目錄> -r 0等效於python -m compileall <目錄> -l
-o:使用給定的優化級別編譯。可多次用於編譯多個級別compileall -o 1 -o 2
-x:用於排除,正則表達式用於搜索考慮編譯的每個文件的完整路徑,如果正則表達式生成匹配項,則跳過該文件。
要強制重新編譯子目錄中的所有文件及其所有子目錄,.pyLib/
import compileall
compileall.compile_dir('Lib/', force=True)
# Perform same compilation, excluding files in .svn directories.
import re
compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)
# pathlib.Path objects can also be used.
import pathlib
compileall.compile_dir(pathlib.Path('Lib/'), force=True)
compile_dir()可以遍歷目錄然后做二進制的編譯。
如下代碼:
import compileall
compileall.compile_dir('examples')
要過濾不必要的目錄,可以使用rx參數提供一個正則表達式來排除不需要的目錄。
import compileall
import re
compileall.compile_dir('examples', rx=re.compile(r'/\.svn'))
maxlevels參數可以控制目錄樹遞歸的層級數,例如,不需要遞歸可以將maxlevels參數設置為0
import compileall
import re
compileall.compile_dir('examples', maxlevels=0, rx=re.compile(r'/\.svn'))
編譯sys.path中包含的所有目錄:
通過調用compile_path()可以編譯sys.path中包含的所有目錄
import compileall
import sys
sys.path[:] = ['examples', 'notthere']
print('sys.path =', sys.path)
compileall.compile_path()
