通常把寫好的Python打包成執行檔,好處除了方便前端呼叫之外,就算運行裝置沒有安裝Python也能跑,因為需要的Python套件和環境都被打包到執行檔裡面了。但也延伸出另一項問題,如果執行檔過大,運算時間會過於冗長,所以執行檔瘦身相當重要。
Numpy幾乎是Python愛好者必用的套件,打包時如果沒特別注意,很可能執行檔隨便就大於100M。
以下簡單寫一份PyinstallerDemo.py,定義一項run函數,包含引數a和回傳值b,run函數內使用numpy對a取絕對值。
接著我們開啟Anaconda Prompt 創建新的虛擬環境 PyexeNormal,作為打包環境。
conda create -n PyexeNormal python=3.5
初始環境會安裝的套件。
開啟打包環境 PyexeNormal。
activate PyexeNormal
安裝 Numpy (一般安裝Numpy的方式)。
conda install numpy
可以看到除了安裝numpy,還會多了blas和mkl的東西。不管! 眼睛閉著勇敢給它裝下去。
安裝打包套件 Pyinstaller。
pip install pyinstaller
查看打包環境 PyexeNormal 已安裝的套件。
conda list
不知道你有沒有發現,就blas套件有點不一樣,明明是用conda指令安裝,但最右側名稱不是py35,而是叫做mkl的東西。
然後把剛才寫好的PyinstallerDemo.py進行打包。
pyinstaller -F PyinstallerDemo.py
打包完成後,會出現三個資料夾與一個spec文件,執行檔放在dist裡面,可以看到執行檔居然有150M !!!...。
我們再換另外一種方式打包,重新創建新的虛擬環境PyexeForge,注意第三行多了 -c conda-forge,安裝Numpy的關聯套件也不一樣,blas不是用mkl安裝,而是openblas。
conda create -n PyexeForge python=3.5
activate PyexeForge
conda install -c conda-forge numpy
pip install pyinstaller
- 2021更新: 若上面安裝後numpy 不是以openblas安裝,改用以下指令:
conda create -n PyexeForge python=3.5
activate PyexeForge
conda install -c conda-forge numpy blas=*=openblas
pip install pyinstaller
查看已安裝的套件,這種方式不會安裝到mkl套件。
打包後執行檔只有10M !!!,相差15倍阿....。