獲取更多文章和更新,請關(guān)注我的個人主頁:www.leiting6.cn
常用打包工具
關(guān)于Python項目打包成可執(zhí)行文件發(fā)布出來已經(jīng)不是新鮮話題了遂庄,目前應(yīng)用比較多的場景是在Windows和Mac環(huán)境下。大家比較常用的打包工具如下格仲。
1. pye2exe for Windows
停更與2014年忍啤,目前只支持py2.x和py3.0-3.4;之前我自己編寫的幾個PyQt5工具一直用py2exe打包的蛉抓,體積相對比較小,但是這幾次打包總是遇到各種各樣的錯誤剃诅,而且應(yīng)用到的某些第三方庫已經(jīng)要求py3.5+的Python環(huán)境了巷送,無奈只能拋棄。
2. pyinstaller for Windows and Mac
一直在更新矛辕,支持py2.7和py3.4-3.7笑跛,功能強大,Windows和Mac平臺都可以使用聊品。
3. py2app for Mac
Mac環(huán)境下使用較多的打包工具飞蹂,功能比較齊全,可以通過setup.py來對打包操作進行配置翻屈。
所謂“完整打包”和“輕打包”
完整打包
介紹
完整打包即把Python腳本主體打包成當前操作系統(tǒng)環(huán)境下的可執(zhí)行文件并附帶上所需要的第三方庫陈哑,一般包含各種動態(tài)鏈接庫和其他組件。比如下面截圖是我去年用PyQt5編寫的一個adb工具伸眶,除了PyQt5庫外惊窖,還使用了configparer庫(一個用于讀寫ini配置文件的第三方庫),以及幾個Python自帶的組件赚抡。這個小工具其實功能并不復(fù)雜爬坑,只是需要PyQt5來完成GUI繪制,但體積卻有50+M涂臣。文件夾里面選中的部分為和PyQt5直接相關(guān)的組件盾计,其大小總和已經(jīng)達到20+M售担。這就是Python項目完整打包的弊端:體積過大。有興趣的朋友可以試驗一下署辉,創(chuàng)建一個py腳本族铆,只寫兩三句特別簡單的語句,甚至不import任何模塊哭尝,然后用上述幾種打包軟件打包成exe或者app看看成品的體積大小如何哥攘。
弊端
- 打包后體積大,比較占用空間材鹦,不方便傳輸
- 每次源碼更新都需要重新打包逝淹,相對來說更新軟件也動作也會比較大
優(yōu)勢
- 包含所有需要的組件,不依賴Python環(huán)境桶唐,不依賴第三方模塊栅葡,拷貝到其他機器上可以直接運行使用
輕打包
介紹
輕打包說白了,就是創(chuàng)建一個啟動入口尤泽,一鍵啟動Python腳本欣簇,當然,如果你愿意坯约,可以放一個快捷方式在桌面熊咽,不過在Windows上,py腳本文件不處理的話打開會有cmd窗口闹丐,而且不能固定到任務(wù)欄或者開始菜單横殴;在Mac上,不能指定圖標妇智,而且也不好放在LaunchPad里滥玷。所以還是生成一個exe或者app更好,嗯巍棱,反正我是信了!很明顯蛋欣,這得要求腳本源文件保持在磁盤的某個位置不能隨意移動航徙,而且Python環(huán)境和依賴也是必須安裝的。
弊端
- 操作系統(tǒng)必須安裝完整的Python壞境
- 使用某個程序得安裝這個程序所必須的第三方庫
- 腳本源文件必須放在磁盤中陷虎,不能隨意移動
- 隨著項目更新到踏,可能得隨之更新Python版本和第三方庫的版本以及安裝新的依賴庫
- 項目開發(fā)者有必要告知用戶需要安裝的Python版本和以及庫版本
優(yōu)勢
- 如果項目更新不涉及Python環(huán)境和第三方庫的改動,可以只更新腳本文件尚猿,而不用重新打包
- 啟動程序輕量級窝稿,而且用戶自行打包也十分容易操作
- 軟件內(nèi)檢查更新功能編寫簡單,只需要更新有更改過的腳本文件即可(如果沒有其他組件需要更新的情況下)
開發(fā)建議
完整打包和輕打包都是有可取之處的凿掂,但如果項目開發(fā)初版就基本定型伴榔,后續(xù)不會涉及重大改變纹蝴,只是修補腳本的邏輯和在之前的基礎(chǔ)上增刪改功能,可能我還是更推薦輕打包踪少,畢竟如上面所說塘安,打包之后軟件更新也十分簡單,只需要單獨編寫一個update.py援奢,更新有改動的腳本文件即可兼犯。
對于開發(fā)者而言呢,我覺得需要注意的部分集漾,是一開始就要對項目做好規(guī)劃切黔,確定使用的環(huán)境和依賴,避免后續(xù)的使用麻煩具篇,而對于像編寫PyQt5之類項目纬霞,我們一定要:
盡量使用PyQt5和Python自帶的功能!T粤险领!
盡量使用PyQt5和Python自帶的功能!C虢簟绢陌!
盡量使用PyQt5和Python自帶的功能!H刍帧脐湾!
因為PyQt5本身涵蓋的功能非常廣,比如我上面提到的處理ini配置文件的功能叙淌,其實PyQt5也是有的秤掌,所以完全可以少安裝一個第三方庫;其他比如系統(tǒng)剪貼板的操作鹰霍、數(shù)據(jù)庫的操作等等闻鉴,PyQt5都是支持的。
輕打包步驟
下面簡要介紹一下Windows下和Mac下對Python項目進行輕打包的步驟茂洒,至于Linux...你都拿Linux當使用環(huán)境了孟岛,也不會來看這個教程了。打包操作以我在github上發(fā)布的七牛云助手項目為例子督勺。
Windows下
1. 安裝Python環(huán)境
這個項目我使用的Python3.6調(diào)試的渠羞,點擊跳轉(zhuǎn)Python官網(wǎng)下載。安裝的時候記得勾上Add PATH智哀,這樣Python的目錄就會加到環(huán)境變量里面去次询。
不出意外,安裝完成后打開cmd瓷叫,輸入
python
屯吊,就能看到命令行已經(jīng)進入了Python解釋器送巡。輸入
pip3
,也能看到pip工作正常雌芽,這是Python安裝依賴的工具授艰。如果cmd不能識別到
python
命令和pip3
命令,可以再次運行安裝包選擇repair世落,
2. 安裝第三方庫
需要安裝3個第三方庫淮腾,分別是:PyQt5圖形庫,configparser庫和PIL庫和打包用的pyinstaller屉佳。
pip3 install pyqt5
pi3 install configparser
pip3 install pillow
pip3 install pyinstaller
其中PyQt5安裝的時候比較久谷朝,耐心等待。
3. 嘗試運行
下載項目打包文件武花,解壓到任意文件夾圆凰,在命令行中cd到當前目錄,當然也可以在沒選中任何文件的情況下按住shift鼠標右鍵點擊空白處体箕,選擇在此處打開powershell专钉。輸入:python QiniuHelper.py
啟動主程序。
簡單操作一下累铅,沒什么問題的話就說明環(huán)境已經(jīng)搭建完成了跃须。
4. 進行打包
下面騷操作來了(敲黑板),同學們看好娃兽。在項目目錄下新建一個run.py(后續(xù)我會把這個腳本放到項目源碼中去)菇民,里面只需要兩行代碼:
import os
os.system('start pythonw QiniuHelper.py')
接著還是在cmd窗口中,cd到項目目錄投储,執(zhí)行以下命令:
pyinstaller -F -w -i icon.ico run.py
其中:
- pyinstaller是執(zhí)行打包的命令第练,剛才通過pip安裝的
- -F表示打包成單個exe文件,不會把組件放到exe外
- -w表示執(zhí)行時不顯示cmd窗口
- -i icon.ico 表示使用icon.ico作為圖標
-
run.py表示將要打包的py腳本對象
不一會玛荞,就會在項目目錄下生產(chǎn)一個build文件夾和dist文件夾娇掏,而dist文件夾下有一個run.exe文件,大小4-5M勋眯,我們把它復(fù)制到項目目錄驹碍,雙擊運行。Duang凡恍!不出意外,程序界面就會成功跳出來了怔球。
image.png
5. 后續(xù)
后續(xù)我會把run.py和打包操作的bat文件放到項目中去嚼酝,用戶一鍵生成就好。
Mac下
1. 安裝Python環(huán)境
同樣竟坛,從Python官網(wǎng)下載適用于Mac的Python3.6安裝包闽巩。安裝過程比較簡單钧舌,一路繼續(xù)就行了。安裝完成后涎跨,打開Mac的終端工具洼冻,輸入python3
和pip3
都沒有提示命令找不到就說明安裝成功了。之所有python和pip命令后面都需要加個3隅很,是因為Mac OS一般都自帶Python2.7撞牢,在Python3.x環(huán)境下開發(fā)的軟件用Python2.7的解釋器打開肯定是會出問題的。
另外我不推薦新手或者只是為了使用一兩個軟件要用到Python環(huán)境的同學安裝anaconda叔营,這貨集成了諸多第三方包和其他功能屋彪,用不上,體積還大绒尊。
2. 安裝第三方庫
同樣需要安裝3個第三方庫畜挥,分別是:PyQt5圖形庫,configparser庫和PIL庫和打包用的py2app婴谱,因為py2app在
pip3 install pyqt5
pi3 install configparser
pip3 install pillow
pip3 install pyinstaller
其中PyQt5安裝的時候比較久蟹但,耐心等待。
3. 嘗試運行
打開Mac的終端谭羔,cd到項目目錄华糖,輸入:
python3 QiniuHelper.py
如果軟件順利打開,則說明可以進行打包操作了口糕。
4. 進行打包
沒有Windows打包時的騷操作缅阳,但是用py2app打開會比pyinstaller打包稍微復(fù)雜一點。
首先景描,是安裝了py2app之后終端可以使用py2applet命令了:
py2applet --make-setup QiniuHelper.py
這一步完成之后會生成一個setup文件十办,然后:
python3 setup.py py2app -A --iconfile icon.icns
其中:
- py2app:打包用的工具
- -A:表示打包成一個啟動入口程序,不采用完整打包方式
-
--iconfile icon.icns:為生成的程序指定一個圖標超棺,Mac下必須使用icns格式的圖標文件向族,png/icon格式無法使用
好了,這是文件夾內(nèi)也會多出一個build文件夾和一個dist文件夾棠绘,dist文件夾內(nèi)有一個QiniuHelper.app件相,這是我們復(fù)制項目文件夾里的icon.png/icon.icns/on.png/off.png,右鍵QiniuHelper.app打開包含內(nèi)容氧苍,把剛才復(fù)制的文件丟到Contents/Resource文件夾中夜矗。這時我們雙擊QiniuHelper.app,就能看到程序界面了让虐。
image.png
因為生成的app是可以移動到任何地方的紊撕,所以盡管把它丟到應(yīng)用程序里去吧,這樣就可以在LaunchPad中看到它赡突、并可以固定到Dock欄上了对扶。
5. 后續(xù)
后續(xù)我也會把一鍵生成的腳本放到源碼中区赵,用戶直接點擊腳本一鍵生成就好。