大佬帶你用Python打包成exe終極方案

2021-05-26 16:00:19

安裝Pyinstaller

首先我們要先安裝Pyinstaller,直接在cmd使用pip命令

pip install pyinstaller 

如果網速太慢可以切換國內源來加速,本文其他部分直接使用國內源,不再重複註釋。

圖片

pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清華源

Pyinstaller打包步驟

這裡我們拿之前《Python自動化辦公 | 同事要我幫忙補寫178份Word日報!》這篇的python程式碼,作為案例來演示。將其中指令碼py_word.py,待處理的表格檔案workbook.xlsx,以及準備好的軟體圖示圖片chengzi.ico放在了我電腦的F:\py_word目錄下(如果大家感興趣的話,可以在文末下載獲取)

圖片

1、cmd切換到我們剛剛放檔案的目錄

圖片

2、執行命令Pyinstaller -F -w -i chengzi.ico py_word.py,執行過程特別漫長,就沒有錄製動圖。

執行完畢會發現當前目錄多了幾個資料夾,開啟其中名為dist的資料夾。

圖片

已經生成了一個名為py_word的exe應用程式,並且圖示也是我們設定的橙子圖案,看來已經成功一半了。

要不執行一下,試試能否正常生成word日報?

圖片

打包exe後執行

成功執行,可惜就是檔案有點大(339M)

Pyinstaller引數詳解

說回剛剛執行的命令

Pyinstaller -F -w -i chengzi.ico py_word.py

給大家解釋一下其中Pyinstaller的引數,其中-F引數代表製作獨立的可執行程式。

-w是指程式啟動的時候不會開啟命令列。如果不加-w的引數,就會有黑洞洞的控制檯視窗出來。比如在剛才的指令碼裡我加一行print('Hello World!'),那麼就不要放-w引數了,不然執行會報錯,畢竟Hello World!需要在命令列裡列印出來。此外,-w引數在GUI介面時非常有用。

最後的-i chengzi.ico就是指設定自己的圖示圖案,因為預設打包圖片是下圖這樣的。這個引數也可以寫成--icon=chengzi.ico

最後稍微總結一下:

Pyinstaller -F py_word.py 打包exe

Pyinstaller -F -w py_word.py 不帶控制檯的打包

Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe圖示打包

以上三個是比較常用的引數,其他引數詳見下表

圖片

Pyinstaller引數大全

ico圖片生成

自己做的軟體都喜歡放上自己的圖示,不過哪來那麼多ico圖片呢?

一個是可以找專門的ico圖片網站,不過都很小眾,圖片庫也很小。

另一個是可以自己生成,這裡就給大家分享一個網站,可以把其他格式圖片轉成ico格式:https://app.xunjiepdf.com/img2icon/

圖片

ico圖片格式轉換

壓縮打包

好了,小夥伴們

來到了最激動人心的時刻,剛剛生成的exe實在太大了,300多M的軟體程式想用微信傳一下都費勁。

我也試過很多方法,比如:修改spec檔案自定義打包、pipenv 虛擬環境、使用開源的upx壓縮等等,但是往往要麼過程比較麻煩,要麼成功率不高(壓縮成不成功全看臉)。

而我要分享的,是自己一直在用的,最簡單且成功率極高的方法——conda建立虛擬環境。

Python打包為什麼大?

在壓縮打包之前,先簡單說一下為什麼Python打包過大?

Python打包exe,不但體積大而且執行奇慢。直譯語言大都是這個樣子,只不過Python尤其突出。要解決大而慢,只能用編譯型語言,如C,C++,甚至VB都好很多,體積最小的是組合。[1]

此外,還有知乎大佬說是因為「Anaconda裡內建了很多庫,打包的時候打包了很多不必要的模組進去,要用純淨的Python來打包。」

所以我們可以模擬一個新環境,其中只安裝我們本次打包所必要的工具包即可。

那最適合的就是——虛擬環境了!

虛擬環境

Python建立虛擬環境的方法有很多,而我是個Anaconda忠實使用者,如果你跟我一樣,那就簡單了。(大家也可以使用Virtualenv、Pipenv來設定虛擬環境,善用搜尋,方法大同小異)

先記幾個命令,很簡單

conda create -n 虛擬環境名字 python==3.6  #建立虛擬環境

conda activate 虛擬環境名字  #啟用虛擬環境

conda deactivate  #退出虛擬環境

從開始選單執行「Anaconda Prompt」,出現的介面輸入建立虛擬環境的指令。成功建立了一個名字為aotu,且基於python版本3.6的虛擬環境。

圖片

在建立過程中需要回復(y/n),Yes,再啟用虛擬環境

圖片

conda安裝的虛擬環境,會把虛擬環境的目錄生成在anaconda安裝目錄下的env目錄下。

圖片

當然我們也可以在剛剛的視窗,使用命令conda info --envs,來檢視conda環境下所有的虛擬環境

圖片

安裝所需的庫

上面我們已經建立並啟用了名為aotu虛擬環境,輸入conda list可以檢視當前虛擬環境裡已經安裝的庫。

圖片

我們開啟所要打包的Python指令碼,對比上圖,發現pandasdocx這兩個庫還需要額外安裝。當然,也不能缺了打包必不可少的pyinstaller庫。

圖片

待打包指令碼

安裝庫的過程不再贅述

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller

安裝後再看

圖片

已成功安裝,還有一些因為這幾個庫所附帶安裝的,就不管他們了。

Pyinstaller打包步驟

這裡就不再重複了,只換個蘋果圖示試試

Pyinstaller -F -w -i apple.ico py_word.py

圖片

生成

圖片

成功壓縮到29.8M,如果不匯入pandas這位大神,應該就可以10多M了

執行一下,毫無問題

圖片

最後再簡單總結一下虛擬環境+打包的全過程(只三步):

#建立虛擬環境
conda create -n aotu python=3.6

#啟用虛擬環境
conda activate aotu

#Pyinstaller打包
Pyinstaller -F -w -i apple.ico py_word.py

總結一些小坑

1、說起來還是有點玄學,上文中一模一樣的過程我在兩個電腦都執行過一遍。在其中一個上顯示缺少xlrd這個庫,安裝後成功打包,也是一樣的大小。小夥伴們可以在文末獲取檔案,也試試。

2、在安裝庫是要注意一些庫名,比如docx這個庫不要pip install docx,而是需要

pip install python-docx

還有一些庫可能因為版本不同導致不能使用,多碰碰壁就好了。

3、為了防止打包時候有些庫沒安裝好,可以先在虛擬環境中執行一下Python指令碼。執行無誤的話再打包,比較保險。

圖片

4、最後,如果想要刪除虛擬環境的話,可執行下方命令

conda remove -n aotu--all 

5、打包為exe的話,版本儘量選擇python3.6+32位元版本,因為win64位元系統向下相容32位元程式,但是如果不考慮32位元系統的話無所謂,直接python64位元版本直接打包就可以,只是只能在win64位元系統上跑。

需要相關資料的可以掃一掃備註【python】