PyQT5 封裝獨(dú)立程序修肠,優(yōu)先推薦 pyinstaller遮怜,而非 py2app 或者 py2exe恋追。事實(shí)上,PyInstaller 封裝 Windows 端的 exe 文件也是不錯(cuò)的選擇摊聋。
這是因?yàn)?py2app 等不會(huì)將程序環(huán)境(如 python 的 frameworks 等),因此并不會(huì)封裝為一個(gè)獨(dú)立的軟件(standalone app)栈暇,具體表現(xiàn)為僅能在本機(jī)正常運(yùn)行麻裁,在別人的電腦上運(yùn)行會(huì)報(bào)錯(cuò)。然而 pyinstaller 則封裝完整源祈,可在同系統(tǒng)的不同機(jī)器上運(yùn)行煎源。
封裝步驟
首先安裝工具包:
pip3 install pyinstaller
然后在 terminal 中依次鍵入:
pyinstaller --windowed --onefile --clean --noconfirm main.py
pyinstaller --clean --noconfirm --windowed --onefile main.spec
其中,如果要自行設(shè)計(jì) Mac 系統(tǒng)下的圖標(biāo)的話新博,那么可以替換第 1 條指令為:
pyinstaller --windowed --onefile --icon=sat_tool_icon.icns --clean --noconfirm main.py
其中圖片轉(zhuǎn)換地址為 https://iconverticons.com/online/
而 windows 系統(tǒng)下的圖片格式應(yīng)為 .ico薪夕。
調(diào)測
一般而言,很少有同學(xué)能一次跑通赫悄,經(jīng)常莫名其妙就閃退了或者報(bào)錯(cuò)原献,非常遺憾大家都得根據(jù)本機(jī)環(huán)境進(jìn)行一些修改馏慨。
那么我們到底要調(diào)測哪些東西呢?從哪里看我們的報(bào)錯(cuò)呢姑隅?
STEP 1: 找到 exec 文件
對于 mac 系統(tǒng)來說写隶,方法有兩個(gè)(其實(shí)本質(zhì)是一個(gè)):
- 大家雙鍵單擊 app 文件選擇 show package contents,如下圖找到你們的 exec 文件(文件名字是自己起的讲仰,主要看文件類型)慕趴;
-
直接打開 exec 文件(文件名字是自己起的,主要看文件類型):
image.png
STEP2: 使用 exec 文件運(yùn)行鄙陡,并查看報(bào)錯(cuò)
如上是正確時(shí)候的運(yùn)行輸出冕房,但如果有錯(cuò),這里會(huì)有具體的報(bào)錯(cuò)信息趁矾,每個(gè)人可能不同耙册。對應(yīng)不同的報(bào)錯(cuò)信息,大家可以直接復(fù)制黏貼到 google 或者 Bing 國際版中查看毫捣,建議優(yōu)先查閱英文網(wǎng)頁详拙。
經(jīng)歷過的坑與解決方案
我來列舉一下我們團(tuán)隊(duì)歷經(jīng)過的坑。
坑1:沒選對當(dāng)前 python 版本
大多數(shù)同學(xué)的電腦中都不止一個(gè) python 版本蔓同,比如 mac 自己本身默認(rèn)的是 python 2.7饶辙。
注意一定要選對 python 的版本,pyinstaller 一定要存在你當(dāng)前 project 的 interpreter 對應(yīng)的 python 版本下斑粱。
坑2:各工具包版本不適配
你可能有不同的包沖突弃揽、不適配,解決的方法也是類似的珊佣。
以我經(jīng)歷的坑為例蹋宦,我電腦的 pandas 版本比較高,在使用 pyinstaller 時(shí)報(bào)錯(cuò)“Pandas missing pandas._libs.tslibs.timedeltas.so
”咒锻,導(dǎo)致在程序運(yùn)行時(shí)終端總是報(bào)錯(cuò)冷冗。
解決的方法是:以 pandas 為例,手動(dòng)增加 hook 文件惑艇,將 pandas 的 hiddenimports(即 Pandas missing pandas._libs.tslibs.timedeltas.so
) 寫入蒿辙。其實(shí)很簡答的,具體如下:滨巴。
STEP 1
找到 pyinstaller 下 hook 文件所在地思灌。鑒于我們使用了 pip3 下載 pyinstaller,我們可以通過 pip3 的相關(guān)指令具體方法為:
pip3 show pyinstaller
在我的本地機(jī)器中恭取,我的 hooks 文件夾地址在于 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyInstaller
STEP 2
在 hook 文件夾中手動(dòng)增加 hook-pandas.py 文件泰偿,在文件中手動(dòng)寫入:hiddenimports = ["XXXX"],其中 XXX 是指你在運(yùn)行 exec 文件中報(bào)錯(cuò)缺失的那個(gè) module 的名字蜈垮,對著抄寫即可耗跛。
比如我的情況為寫入:
hiddenimports = ['pandas._libs.tslibs.timedeltas']