python封裝 (pyinstaller)

    windows 下編寫控制檯程序後,會生成exe的可執行程序,創建工程最後都會生成可執行程序,python工程都是python調用各種模塊,執行起來也不方便,所以這裏講一下python封裝exe文件過程!

windows 系統(按照我自己環境):

    首先我們拿到python工程文件後,必須保證程序可以正常執行,才能在此環境中進行封裝,不然封裝成功了,執行時會報錯,提示有些模塊沒有導入

    

    1. 打開cmd 運行 pip install pyinstaller :

    

    2. 安裝時,報錯,具體就是pywin32版本不對,需要重新安裝pywin32:

    

    3. 打開網址 https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,選擇pywin32 下載whl文件,注意要和電腦 匹配  
    

    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 系統來說,方法有兩個(其實本質是一個):

  1. 大家雙鍵單擊 app 文件選擇 show package contents,如下圖找到你們的 exec 文件(文件名字是自己起的,主要看文件類型);
image.png
  1. 直接打開 exec 文件(文件名字是自己起的,主要看文件類型):

    image.png

STEP2: 使用 exec 文件運行,並查看報錯

image.png

如上是正確時候的運行輸出,但如果有錯,這裏會有具體的報錯信息,每個人可能不同。對應不同的報錯信息,大家可以直接複製黏貼到 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系統封裝 碰到了各種問題,還是不太瞭解裏面的運行機制,以後再深入瞭解把!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章