Python 打包成 exe 終極方案

目前比較常見的打包 exe 方法都是通過Pyinstaller來實現的,本文也將使用這種常規方法。如果對這塊已經很熟悉的小夥伴,可以直接下滑到本文下半部分。


爲什麼要打包?

衆所周知,Python 腳本不能在沒有安裝 Python 的機器上運行。

那我們如果寫了一個數據分析 / 自動化辦公的小腳本,想分享給同事小姐姐使用,可她電腦又沒有裝 Python。

這個時候如果將腳本打包成 exe 文件,微信發送給她,即使她的電腦上沒有安裝 Python 解釋器,這個 exe 程序也能在上面運行。豈不美哉?

(當然,想通過幫安裝 Python 跟小姐姐建立感情的話,就當我沒說)

安裝 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 位系統上跑。[2]

參考資料

[1]

弗拉基米爾: https://www.zhihu.com/question/281858271/answer/613147412

[2]

《別再問我怎麼 Python 打包成 exe 了!》: https://mp.weixin.qq.com/s/zilDeFunWLG0mBS_x0vNnA

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/tIjcCjesd6iLzvQPtx6D0g