1. 程式人生 > >如何生成pyc/pyo/pyd文件

如何生成pyc/pyo/pyd文件

替換 force 否則 優化 怎麽辦 pil std 排除 none

# 一.如何生成pyc/pyo文件

# 1.通過編寫代碼生成
import py_compile
# 參數如下
‘‘‘
def compile(file, cfile=None, dfile=None, doraise=False, optimize=-1):
    file:要編譯的源文件
    cfile:編譯之後的pyc文件路徑和文件名,默認直接在file後面加上c或者o(會保存在當前目錄的__pycache__文件夾下),
           pyo相當於優化之後的pyc
    dfile:把在錯誤信息中顯示的file用dfile替換
    doraise:True或False,如果為True,那麽文件編譯出錯的話,則會引發一個PyCompileError。
            為False的話,編譯出錯會顯示在sys.stderr中
    optimize:用於編譯的優化級別,有效的值為-1,0,1,2。-1表示當前解釋器的優化級別
              使用命令行的時候如果設置優化級別,通過-O來設置。用於生成pyo文件了。
說白了後面幾個參數基本上用不到
‘‘‘
py_compile.compile("your_py_file")

# 2.通過命令行生成
# python (-O) -m py_compile your_py_file.py   ,加上-O表示優化


‘‘‘
有的時候我們不想只編譯一個py文件,而是編譯一個文件夾下的所有py文件怎麽辦呢?
python還為我們提供了一個模塊
‘‘‘
import compileall
# 參數如下
‘‘‘
def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None,
                quiet=0, legacy=False, optimize=-1, workers=1):
dir:文件夾路徑
maxlevels:遞歸編譯的的子目錄的層數,默認是把10層子目錄的py文件編譯成pyc
ddir:和上面的dfile類似
force:如果為True,將強制編譯為pyc,即便現在pyc文件是最新的,依舊會編譯一次
rx:一個正則表達式,可以排除掉不想編譯的目錄,只編譯想要的目錄
quiet:給我安靜點,編譯之後不會在標準輸出中,打印信息                
‘‘‘
compileall.compile_dir("your_dir")

# 同樣可以使用命令行
# python -m compileall your_dir

  我們來編譯一個試試

技術分享圖片

技術分享圖片

首先我在foo.py中定義了一個函數fuck,然後在bar.py中進行編譯,這裏就不使用命令行了,效果是一樣的。

技術分享圖片

會發現在當前目錄下的__pycache__目錄中多出了一個文件,正是剛才對編譯的字節碼文件。我們把它移動到當前目錄來,並把foo.py刪除,並把名字改一下,否則無法導入

技術分享圖片

技術分享圖片

技術分享圖片

發現依舊執行成功了,py文件和pyc文件可以按照相同的方式導入

--------------------------------------------------------------------

如何生成pyc/pyo/pyd文件