編譯python源代碼


編譯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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM