大家都知道Python程式碼是直譯程式,未經過編譯程序,一行一行執行,不過因為最近有專案需求,要將python程式碼進行封裝(將採用Cython來進行說明),就是打包成編譯過的檔案,而且是會提升Python執行速度,又可以把程式碼封裝起來,可謂一舉兩得啊!
所以先簡單記錄一下怎麼進行,避免未來忘記!
1.當然是下載編譯套件 Cython
1 |
pip install Cython |
2.準備一個要進行編譯的.py檔案,叫做hello.py
1 2 |
def hello(): print('hello') |
3.可以先試試看可不可以印出hello
1 |
python -c "from hello import hello;hello()" |
4.準備一個編譯用的py程式,叫做buildso.py
1 2 3 4 5 |
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize('hello.py')) |
其中可以看到hello.py就是你要編譯的那個檔案,是一個dict,可以多個
5.執行編譯
1 2 3 |
python buildso.py build_ext or python buildso.py build_ext --inplace |
加入–inplace是表示在同級目錄產生so檔案(此案例為hello.cpython-37m-darwin.so)
6.你將在目錄下看到多了一個build資料夾:
裡面會有一堆資料夾,其中有個資料夾(通常為lib.xxxxxxx)包含了所有你編譯過的檔案,但會變成檔名.so(此案例為hello.cpython-37m-darwin.so),這就是我們最終要使用的.
7.測試,先移除之前的hello.py,留下hello.cpython-37m-darwin.so,改名為hello.so,執行
1 |
python -c "from hello import hello;hello()" |
如果順利執行就代表so檔沒問題,可以順利替換喔,因為這只是紀錄,就不對比執行速度.
8.備註:
-你應該會在同級目錄下看到產生一個hello.c,基本上Cython工作原理有點像是,先把.py轉換成.c(C/C++ extensions)的檔案,在使用C編譯器轉換成最終.so檔
-在使用mac時可能會遇到以下訊息
1 |
command 'gcc' failed with exit status 1 |
基本上就可能是gcc編譯程式錯誤可以嘗試以下指令修復看看
1 |
xcode-select --install |
-很重要一點,在不同環境下需要重新編譯,例如我在Mac上編譯的so無法拿到Ubuntu上面使用,需要直接在Ubuntu上編譯
-補充說明,需要編譯的版本要一致性,如python2 or python3要注意!
—20220307補充—
在Linux環境上,還可能產生以下錯誤,或是採用不同版本的Python都要特別注意:
1 2 3 4 5 |
file.c:18:10: fatal error: Python.h: No such file or directory #include "Python.h" compilation terminated. ....etc |
屆時需要安裝開發套件,通常就是出什麼錯誤安裝什麼資訊.
1 |
sudo apt-get install python3.x-dev |