別再問我Python怎么打包成exe了!
大家好~之前發(fā)布了一篇文章:5 個無聊透頂?shù)腜ython 程序,之后一直有讀者在后臺問有關(guān)Python腳本打包成exe的問題。今天就推薦給大家一篇文章,全面總結(jié)一下:Python如何打包成exe,以及如何打得足夠小。
標準打包
目前比較常見的打包exe方法都是通過Pyinstaller來實現(xiàn)的,本文也將使用這種常規(guī)方法。如果對這塊已經(jīng)很熟悉的小伙伴,可以直接下滑到本文下半部分。
為什么要打包?
眾所周知,Python腳本不能在沒有安裝Python的機器上運行。
那我們?nèi)绻麑懥艘粋€數(shù)據(jù)分析/自動化辦公的小腳本,想分享給同事小姐姐使用,可她電腦又沒有裝Python。
這個時候如果將腳本打包成exe文件,微信發(fā)送給她,即使她的電腦上沒有安裝Python解釋器,這個exe程序也能在上面運行。豈不美哉?

(當(dāng)然,想通過幫安裝Python跟小姐姐建立感情的話,就當(dāng)我沒說)
安裝Pyinstaller
首先我們要先安裝Pyinstaller,直接在cmd使用pip命令
pip install pyinstaller
如果網(wǎng)速太慢可以切換國內(nèi)源來加速,本文其他部分直接使用國內(nèi)源,不再重復(fù)注釋。

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

1、cmd切換到代碼文件所在目錄(如果大家感興趣的話,可以在文末下載獲取案例文件)

2、執(zhí)行命令Pyinstaller -F -w -i chengzi.ico py_word.py,執(zhí)行過程特別漫長,就沒有錄制動圖。
執(zhí)行完畢會發(fā)現(xiàn)當(dāng)前目錄多了幾個文件夾,打開其中名為dist的文件夾。
已經(jīng)生成了一個名為py_word的exe應(yīng)用程序,并且圖標也是我們設(shè)置的橙子圖案,看來已經(jīng)成功一半了。
要不運行一下,試試能否正常生成word日報?
成功運行,可惜就是文件有點大(339M)

Pyinstaller參數(shù)詳解
說回剛剛執(zhí)行的命令
Pyinstaller -F -w -i chengzi.ico py_word.py
給大家解釋一下其中Pyinstaller的參數(shù),其中-F參數(shù)代表制作獨立的可執(zhí)行程序。
-w是指程序啟動的時候不會打開命令行。如果不加-w的參數(shù),就會有黑洞洞的控制臺窗口出來。比如在剛才的腳本里我加一行print('Hello World!'),那么就不要放-w參數(shù)了,不然運行會報錯,畢竟Hello World!需要在命令行里打印出來。此外,-w參數(shù)在GUI界面時非常有用。
最后的-i chengzi.ico就是指設(shè)置自己的圖標圖案,因為默認打包圖片是下圖這樣的。這個參數(shù)也可以寫成--icon=chengzi.ico

最后稍微總結(jié)一下:
Pyinstaller -F py_word.py 打包exe
Pyinstaller -F -w py_word.py 不帶控制臺的打包
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe圖標打包
以上三個是比較常用的參數(shù),其他參數(shù)詳見下表

Pyinstaller參數(shù)大全
ico圖片生成
自己做的軟件都喜歡放上自己的圖標,不過哪來那么多ico圖片呢?
一個是可以找專門的ico圖片網(wǎng)站,不過都很小眾,圖片庫也很小。
另一個是可以自己生成,這里就給大家分享一個網(wǎng)站,可以把其他格式圖片轉(zhuǎn)成ico格式:https://app.xunjiepdf.com/img2icon/
壓縮打包
好了,小伙伴們
來到了最激動人心的時刻,剛剛生成的exe實在太大了,300多M的軟件程序想用微信傳一下都費勁。
我也試過很多方法,比如:修改spec文件自定義打包、pipenv 虛擬環(huán)境、使用開源的upx壓縮等等,但是往往要么過程比較麻煩,要么成功率不高(壓縮成不成功全看臉)。
而我要分享的,是自己一直在用的,最簡單且成功率極高的方法——conda創(chuàng)建虛擬環(huán)境。

Python打包為什么大?
在壓縮打包之前,先簡單說一下為什么Python打包過大?
Python打包exe,不但體積大而且運行奇慢。解釋型語言大都是這個樣子,只不過Python尤其突出。要解決大而慢,只能用編譯型語言,如C,C++,甚至VB都好很多,體積最小的是匯編。[1]
此外,還有知乎大佬說是因為“Anaconda里內(nèi)置了很多庫,打包的時候打包了很多不必要的模塊進去,要用純凈的Python來打包。”
所以我們可以模擬一個新環(huán)境,其中只安裝我們本次打包所必要的工具包即可。
那最適合的就是——虛擬環(huán)境了!
虛擬環(huán)境
Python創(chuàng)建虛擬環(huán)境的方法有很多,而我是個Anaconda忠實用戶,如果你跟我一樣,那就簡單了。(大家也可以使用Virtualenv、Pipenv來設(shè)置虛擬環(huán)境,善用搜索,方法大同小異)
先記幾個命令,很簡單
conda create -n 虛擬環(huán)境名字 python==3.6 #創(chuàng)建虛擬環(huán)境
conda activate 虛擬環(huán)境名字 #激活虛擬環(huán)境
conda deactivate #退出虛擬環(huán)境
從開始菜單運行“Anaconda Prompt”,出現(xiàn)的界面輸入創(chuàng)建虛擬環(huán)境的指令。成功創(chuàng)建了一個名字為aotu,且基于python版本3.6的虛擬環(huán)境。

在創(chuàng)建過程中需要回復(fù)(y/n),Yes,再激活虛擬環(huán)境

conda安裝的虛擬環(huán)境,會把虛擬環(huán)境的目錄生成在anaconda安裝目錄下的env目錄下。
當(dāng)然我們也可以在剛剛的窗口,使用命令conda info --envs,來查看conda環(huán)境下所有的虛擬環(huán)境
安裝所需的庫
上面我們已經(jīng)創(chuàng)建并激活了名為aotu虛擬環(huán)境,輸入conda list可以查看當(dāng)前虛擬環(huán)境里已經(jīng)安裝的庫。
我們打開所要打包的Python腳本,對比上圖,發(fā)現(xiàn)pandas,docx這兩個庫還需要額外安裝。當(dāng)然,也不能缺了打包必不可少的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打包步驟
這里就不再重復(fù)了,只換個蘋果圖標試試
Pyinstaller -F -w -i apple.ico py_word.py
生成
成功壓縮到29.8M,如果不導(dǎo)入pandas這位大神,應(yīng)該就可以10多M了
運行一下,毫無問題
最后再簡單總結(jié)一下虛擬環(huán)境+打包的全過程(只三步):
#創(chuàng)建虛擬環(huán)境
conda create -n aotu python=3.6
#激活虛擬環(huán)境
conda activate aotu
#Pyinstaller打包
Pyinstaller -F -w -i apple.ico py_word.py
總結(jié)一些小坑
1、說起來還是有點玄學(xué),上文中一模一樣的過程我在兩個電腦都執(zhí)行過一遍。在其中一個上顯示缺少xlrd這個庫,安裝后成功打包,也是一樣的大小。小伙伴們可以在文末獲取文件,也試試。
2、在安裝庫是要注意一些庫名,比如docx這個庫不要pip install docx,而是需要
pip install python-docx
還有一些庫可能因為版本不同導(dǎo)致不能使用,多碰碰壁就好了。
3、為了防止打包時候有些庫沒安裝好,可以先在虛擬環(huán)境中執(zhí)行一下Python腳本。運行無誤的話再打包,比較保險。
4、最后,如果想要刪除虛擬環(huán)境的話,可執(zhí)行下方命令
conda remove -n aotu--all
5、打包為exe的話,版本盡量選擇python3.6+32位版本,因為win64位系統(tǒng)向下兼容32位程序,但是如果不考慮32位系統(tǒng)的話無所謂,直接python64位版本直接打包就可以,只是只能在win64位系統(tǒng)上跑。[2]
下載鏈接
如果大家想測試Python打包,手頭又沒有合適的文件,可以在「python客棧」后臺回復(fù)“打包”即可獲得以下文件:

參考資料
弗拉基米爾: https://www.zhihu.com/question/281858271/answer/613147412
[2]《別再問我怎么Python打包成exe了!》: https://mp.weixin.qq.com/s/zilDeFunWLG0mBS_x0vNnA


留言送書


推薦理由:
(1)實戰(zhàn)技能:本書講解了Python編程從入門到精通可能涉及的100個關(guān)鍵技能。
(2)關(guān)鍵練習(xí):100個關(guān)鍵技能,對應(yīng)100個關(guān)鍵練習(xí),能學(xué)會用。
(3)重點視頻:重點、難點,都有視頻講解,降低了學(xué)習(xí)難度曲線。
贈送獎品:
Python編程寶典:迅速提高編程水平的100個關(guān)鍵技能*4
活動規(guī)則:
活動截止時我們將從精選留言中選出 四條 走心留言贈送書籍。(每人當(dāng)月僅限一次中獎機會)
留言要求:
內(nèi)容與本文相關(guān)的留言
每人僅限精選一條留言
另外我們每天還會在文末的留言中隨機抽取 3位 小伙伴贈送
6.6元的現(xiàn)金紅包,感謝大家一直以來的支持。
截止時間: 2021 年 3 月 7 日 16:00 整

昨日留言中獎名單




恭喜三位中獎的童鞋,快加小編微信(Mayyy530)來領(lǐng)獎吧!

1、調(diào)試Python代碼,千萬別再用Print了!
2、史上最全Python 操作 Excel庫總結(jié)!
3、手機上運行 Python?這款工具比 QPython 還好用













