Python – packaging light exe file

簡介

在先前我們有說到使用python撰寫程式時,會透過anaconda建立一個虛擬環境,並且將程式中需要用到的package套件安裝在你新增的環境中。我們在本基處理時基本上不需要考慮到整個虛擬空間的檔案大小,但假如我們需要把開發好的工具打包成.exe檔案給客戶時,就要考慮到檔案大小了。

打包成.exe的套件大家最常使用的有兩個套件「pyinstaller 與 py2exe」,而在使用套件打包時,會把你程式中有用到的其他套件都包在.exe中,所以我們需要在建立一個更輕量的虛擬環境供打包套件打包。這篇我們就來介紹一下以上說述說的幾個要點。

從.ipynb → .py

在創建虛擬空間之前,我們可以先做一個小動作。我個人蠻常使用jupyter notebook來撰寫部分的功能,最後再將所有小功能都串在一起,原因是他可以快速的做測試,你就可以快速地修正程式碼,但通常打包套件不太能把.ipynb(jupyter notebook的檔案副檔名)做打包的動作,所以jupyter notebook有提供把.ipynb另存成.py的功能。

如上圖所示,在jupyter頁面中有個「file」,並選擇「Download as」「Python(.py)」另存的動作就完畢了。但還有一些後續動作需要在當你把檔案搬到新的虛擬環境時要動作的,例如移除.ipynb裡有使用到的「!pip install」、安裝檔案中要用的套件在虛擬環境等等。

建立虛擬空間

pip install virtualenv

Step1 : 首先我們先安裝「virtualenv」創建虛擬環境的套件,如上圖。

virtualenv --version

安裝好後我們可以做一個測試,看看你的套件有沒有安裝成功,假如有的話,就會顯示該套件的版本號。

Step2 : 確認可以喚起「virtualenv」在cmd時,我們就開始創建一個虛擬空間。

virtualenv 空間名稱

可以看到在創建完成後,套件會幫你安裝一些基本套件,如上圖。

並且在你的資料夾中,出現了透過virtualenv新增出一個實體的資料夾,這資料夾就是要放你所寫的程式與打包完成後的檔案。

Step3 : 到了最後一個步驟了,請到剛剛透過virtualenv新增的資料夾中,並進入「Scripts」資料夾內,並輸入:

activate

如上圖,當你輸入完「activate」後,在路徑前面就會出現跟使用anaconda時會出現的虛擬空間前贅詞,如此就完成了新增虛擬空件的動作了。

打包成.exe

Step1 : 在進行打包python成.exe前,我們要在虛擬空間安裝打包套件以及你程式中所有使用到的套件。

pip install pyinstaller

成功安裝打包套件後會呈現如上圖的資訊。

pyinstaller -F 主程式名稱.py

Step2 : 在前面的「-F」就是帶入pyinstaller的參數,下方是所有pyinstaller的參數介紹,由於我們是要打包成一個.exe檔案,所以我們就選用「-F」參數即可。

-F, –onefile打包一個單個文件,如果你的代碼都寫在一個.py文件的話,可以用這個,如果是多個.py文件就別用
-D, –onedir打包多個文件,在dist中生成很多依賴文件,適合以框架形式編寫工具代碼,我個人比較推薦這樣,代碼易於維護
-K, –tk在部署時包含 TCL/TK
-a, –ascii不包含編碼.在支持Unicode的python版本上默認包含所有的編碼.
-d, –debug產生debug版本的可執行文件
-w,–windowed,–noconsole使用Windows子系統執行.當程序啓動的時候不會打開命令行(只對Windows有效)
-c,–nowindowed,–console使用控制檯子系統執行(默認)(只對Windows有效)pyinstaller -c xxxx.pypyinstaller xxxx.py –console
-s,–strip可執行文件和共享庫將run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用.
-X, –upx如果有UPX安裝(執行Configure.py時檢測),會壓縮執行文件(Windows系統中的DLL也會)(參見note)
-o DIR, –out=DIR指定spec文件的生成目錄,如果沒有指定,而且當前目錄是PyInstaller的根目錄,會自動創建一個用於輸出(spec和生成的可執行文件)的目錄.如果沒有指定,而當前目錄不是PyInstaller的根目錄,則會輸出到當前的目錄下.
-p DIR, –path=DIR設置導入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號,Linux使用冒號)分割,指定多個目錄.也可以使用多個-p參數來設置多個導入路徑,讓pyinstaller自己去找程序需要的資源
–icon=<FILE.ICO>將file.ico添加爲可執行文件的資源(只對Windows系統有效),改變程序的圖標 pyinstaller -i ico路徑 xxxxx.py
–icon=<FILE.EXE,N>將file.exe的第n個圖標添加爲可執行文件的資源(只對Windows系統有效)
-v FILE, –version=FILE將verfile作爲可執行文件的版本資源(只對Windows系統有效)
-n NAME, –name=NAME可選的項目(產生的spec的)名字.如果省略,第一個腳本的主文件名將作爲spec的名字

資料來源:https://www.twblogs.net/a/5d671635bd9eee5327fecc20

Step3 : 而不是每次打包都會成功,失敗的原因就是你的程式碼中有錯誤,不然就是沒有安裝好在你主程式有import到的套件,像我遇到的錯誤就如下圖,所以在你打包前,可以使用熟悉的IDE來Run看看是否可以成功運作在進行打包。

Step4 : 在打包成功後,資料夾會出現多幾個資料夾,主程式通常就是放在「dist」資料夾中。而假如你有讀取額外的檔案且是用相對路徑的話,要把額外檔案放在跟.exe同一層中,取決你程式撰寫時讀取檔案的方式,如此一切就完成了。

小結

在沒使用virtualenv虛擬環境打包前,是使用anaconda虛擬環境來打包,檔案大小從300多MB變成20MB,果然省了許多,而且打包完的.exe在客戶電腦中無須再安裝相關python的套件或軟體,點擊即可使用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *