如何在Python中生成位元組碼檔案


所有Python程式都會在執行之前自動將你的原始碼編譯成編譯程式碼,也稱為位元組碼。

無論何時你第一次匯入模組,或者你的原始檔是新檔案,或者你更新了檔案,那麼在編譯檔案時,會在與.py檔案相同的目錄下建立一個最近編譯的檔案.pyc檔案(從Python 3開始,你可能會看到.pyc檔案位於名為__pycache__的子目錄中,而不是與你的.py檔案相同的目錄中)。這是一種節省時間的方法,因為它可以防止Python在下一次執行程式時跳過編譯步驟。

如果你正在執行帶有匯入語句(另一個檔案)的指令碼,則不會建立.pyc檔案。例如,如果你有一個指令碼(file1.py)匯入另一個檔案(file2.py)。

建立PYC檔案的 easiest 方法是匯入它。假設你有一個名為MainP.py的模組,只需執行:

>>> import MainP
>>>

但是,如果你想為未匯入的模組建立.pyc檔案,則必須使用名為py_compile的模組集來編譯所有模組以執行此任務。

py_compile模組可以手動編譯任何模組。我們還可以使用py_compile.compile函式以互動方式使用py_compile模組。

>>> import py_compile
>>> py_compile.compile('test.py')
'__pycache__\test.cpython-36.pyc'
>>>

在Python shell中執行上述語句後,你可以在__pycache__資料夾(Python 3)中看到一個.pyc檔案,否則會在與你的test.py檔案相同的位置建立。

如果你想一次編譯多個檔案,可以使用py_compile.main()函式,如下所示:

>>> #Compiles several files at a time
>>> py_compile.main(['test1.py', 'test2.py', 'test_sample1.py', 'test_sample2.py'])
0

我們可以看到生成了四個不同的編譯檔案:

但是,如果你想編譯資料夾內的所有檔案,可以使用compileall.compile_dir()函式。

>>> # Compile all the .py file from a particular folder.
>>> import compileall
>>> compileall.compile_dir('gmplot')
Listing 'gmplot'...
Listing 'gmplot\.git'...
Listing 'gmplot\.git\hooks'...
Listing 'gmplot\.git\info'...
Listing 'gmplot\.git\logs'...
Listing 'gmplot\.git\logs\refs'...
Listing 'gmplot\.git\logs\refs\heads'...
Listing 'gmplot\.git\logs\refs\remotes'...
Listing 'gmplot\.git\logs\refs\remotes\origin'...
Listing 'gmplot\.git\objects'...
Listing 'gmplot\.git\objects\info'...
Listing 'gmplot\.git\objects\pack'...
Listing 'gmplot\.git\refs'...
Listing 'gmplot\.git\refs\heads'...
Listing 'gmplot\.git\refs\remotes'...
Listing 'gmplot\.git\refs\remotes\origin'...
Listing 'gmplot\.git\refs\tags'...
Compiling 'gmplot\__init__.py'...
Compiling 'gmplot\color_dicts.py'...
Listing 'gmplot\gmplot'...
Listing 'gmplot\gmplot\markers'...
Compiling 'gmplot\gmplot.py'...
Compiling 'gmplot\google_maps_templates.py'...
Compiling 'gmplot\setup.py'...
Listing 'gmplot\tests'...
True

現在我們看到.pyc檔案已建立在“folder_name\__pycache__”位置。

如果你想編譯目錄或目錄內的所有檔案,可以使用compile函式。

C:\Users\rajesh>python -m compileall
Skipping current directory
Listing 'C:\Python\Python361\python36.zip'...
Can't list 'C:\Python\Python361\python36.zip'
Listing 'C:\Python\Python361\DLLs'...
Listing 'C:\Python\Python361\lib'...
Listing 'C:\Python\Python361'...
Compiling 'C:\Python\Python361\BeautifulSoup_script1.py'...
Compiling 'C:\Python\Python361\EDA_python1.py'...
Compiling 'C:\Python\Python361\MainP.py'...
Compiling 'C:\Python\Python361\NegativeAgeException.py'...
Compiling 'C:\Python\Python361\NegativeNumberException.py'...
Compiling 'C:\Python\Python361\OtherP.py'...
Compiling 'C:\Python\Python361\__init__ Constructor.py'...
Compiling 'C:\Python\Python361\attribute_access.py'...
…..
…
Compiling 'C:\Python\Python361\variable_arguments_list.py'...
Compiling 'C:\Python\Python361\variable_arguments_list1.py'...
Compiling 'C:\Python\Python361\winquality1.py'...

我們可以看到,為__pycache__目錄內的所有檔案建立了.pyc檔案。

更新於:2019年7月30日

瀏覽量:1K+

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告