windows 下編寫控制檯程序後,會生成exe的可執行程序,創建工程最後都會生成可執行程序,python工程都是python調用各種模塊,執行起來也不方便,所以這裏講一下python封裝exe文件過程!
windows 系統(按照我自己環境):
首先我們拿到python工程文件後,必須保證程序可以正常執行,才能在此環境中進行封裝,不然封裝成功了,執行時會報錯,提示有些模塊沒有導入
1. 打開cmd 運行 pip install pyinstaller :
2. 安裝時,報錯,具體就是pywin32版本不對,需要重新安裝pywin32:
4. 進入下載好的目錄下, 運行pip install pywin32.whl
5. 再次安裝pyinstaller,安裝成功,準備打包
打包:
1. 確定程序入口(相當於程序的主函數)
2. 通過 cd 命令進入main.py文件所在路徑
3. 執行命令: pyinstaller -F -wmain.py --hidden-import=pandas._libs.tslibs.timedeltas可以看到相應目錄生成build和dist文件夾 build文件夾沒用 可以刪除
4. 將platforms文件夾放到exe文件同級目錄,運行exe(這裏platforms 裏面是pyqt調用的動態庫文件)
5. 打開exe,成功
Mac osx系統
PyQT5 封裝獨立程序,優先推薦 pyinstaller,而非 py2app 或者 py2exe。事實上,PyInstaller 封裝 Windows 端的 exe 文件也是不錯的選擇。
這是因爲 py2app 等不會將程序環境(如 python 的 frameworks 等),因此並不會封裝爲一個獨立的軟件(standalone app),具體表現爲僅能在本機正常運行,在別人的電腦上運行會報錯。然而 pyinstaller 則封裝完整,可在同系統的不同機器上運行。
封裝步驟
在 terminal 中依次鍵入:
pip3 install pyinstaller
pyinstaller --windowed --onefile --clean --noconfirm main.py
pyinstaller --clean --noconfirm --windowed --onefile main.spec
調測
一般而言,很少有同學能一次跑通,經常莫名其妙就閃退了或者報錯,非常遺憾大家都得根據本機環境進行一些修改。
那麼我們到底要調測哪些東西呢?從哪裏看我們的報錯呢?
STEP 1: 找到 exec 文件
對於 mac 系統來說,方法有兩個(其實本質是一個):
- 大家雙鍵單擊 app 文件選擇 show package contents,如下圖找到你們的 exec 文件(文件名字是自己起的,主要看文件類型);
直接打開 exec 文件(文件名字是自己起的,主要看文件類型):
STEP2: 使用 exec 文件運行,並查看報錯
如上是正確時候的運行輸出,但如果有錯,這裏會有具體的報錯信息,每個人可能不同。對應不同的報錯信息,大家可以直接複製黏貼到 google 或者 Bing 國際版中查看,建議優先查閱英文網頁。
經歷過的坑與解決方案
我來列舉一下我們團隊歷經過的坑。
坑1:沒選對當前 python 版本
大多數同學的電腦中都不止一個 python 版本,比如 mac 自己本身默認的是 python 2.7。
注意一定要選對 python 的版本,pyinstaller 一定要存在你當前 project 的 interpreter 對應的 python 版本下。
坑2:各工具包版本不適配
你可能有不同的包衝突、不適配,解決的方法也是類似的。
以我經歷的坑爲例,我電腦的 pandas 版本比較高,在使用 pyinstaller 時報錯“Pandas missing pandas._libs.tslibs.timedeltas.so
”,導致在程序運行時終端總是報錯。
解決的方法是:以 pandas 爲例,手動增加 hook 文件,將 pandas 的 hiddenimports(即 Pandas missing pandas._libs.tslibs.timedeltas.so
) 寫入。其實很簡答的,具體如下:。
STEP 1
找到 python frameworks 下 hook 文件所在地
STEP 2
在 hook 文件夾中手動增加 hook-pandas.py 文件,在文件中手動寫入:hiddenimports = ["XXXX"],其中 XXX 是指你在運行 exec 文件中報錯缺失的那個 module 的名字,對着抄寫即可。
比如我的情況爲寫入:
封裝windows時,很順利,mac系統封裝 碰到了各種問題,還是不太瞭解裏面的運行機制,以後再深入瞭解把!