天天看點

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

python 使用 pyinstaller 打包子產品指令打包出來的exe檔案太大了怎麼辦?

問題描述——​

​pyinstaller​

​ 打包出來的exe檔案太大了怎麼辦?

運作打包指令

pyinstaller -F naughtyconfession.py -w  #不把音樂,字型,圖檔等檔案打包進exe檔案,并且在終端執行      
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

問題原因

為什麼使用 ​

​pyinstaller​

​打包這麼大,因為他把一些不必要的包給打包進去了

解決方法

如果解決這個打封包件太大的問題,可以使用一個工具進行壓縮,或者用其它打包的庫

第一個方法:使用工具庫壓縮

upx壓縮

查找資料的過程中,在他人部落格發現了一個可以打包壓縮的工具:

https://github.com/upx/upx      

詳細的介紹自己去網站上看,簡單概括一下就是(内容來自百度詞條):

UPX (the Ultimate Packer for eXecutables)
是一款先進的可執行程式檔案壓縮器,壓縮過的可執行檔案體積縮小50%-70% ,
這樣減少了磁盤占用空間、網絡上傳下載下傳的時間和其它分布以及存儲費用。
通過 UPX 壓縮過的程式和程式庫完全沒有功能損失和壓縮之前一樣可正常地運作,
對于支援的大多數格式沒有運作時間或記憶體的不利後果。 
12345      

具體使用起來十分友善,首先,去官網下載下傳對應版本的upx檔案:

https://github.com/upx/upx/releases/tag/v3.96      
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

點選這個下載下傳

或者使用這個下載下傳位址,複制到浏覽器上面下載下傳:

https://github.com/upx/upx/releases/download/v3.96/upx-3.96-win64.zip      
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

下載下傳完成後将其放在我們需要打包的py檔案所在的目錄:

解壓後:

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

把裡面的exe程式放到要打包py檔案下

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

然後運作如下指令就ok啦:

pyinstaller -F 123.py -w --upx-exclude=vcruntime140.dll      

這裡禁用vcruntime140.dll的原因是參考了這裡:

https://github.com/pyinstaller/pyinstaller/issues/1565
1      

最終打包的效果如下:

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

發現體積确實是被壓縮了,不過壓縮的很小

為了打包時候體積更加小,可以在打封包件

我們可以修改剛剛運作打包指令時生成的:

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

你可以在第十三行添加你認為打包過程中不需要的包,這樣pyinstaller在打包的過程中就不會再使用這些包了。重新運作一下指令:

pyinstaller -F 123.spec
注意這次是123.spec而不是123.py啦!!!      

2.使用虛拟環境 降低打包過程中打包一些不必要的環境進入exe程式裡面

顯然,一個最直接的想法是建立一個虛拟環境,裡面隻裝我們需要的py包,這樣打包過程中就不會搞進去一些沒用的py包了。首先,我們安裝一下pipenv這個包,友善我們建立虛拟環境:

pip install pipenv      
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

然後執行如下指令建立虛拟環境:

pipenv install      

效果如下:

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

接着執行如下指令進入虛拟環境:

pipenv shell      

效果如下:

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

安裝運作我們程式所需要的依賴包:

pip install pygame      

以及打包我們程式所需要的依賴包:

pip install pyinstaller      

然後,重新運作一下我們的打包指令:

pyinstaller -F 123.py -w      

第二個方法:使用其它打包庫

Nuitka的安裝及使用

2 nuitka的安裝

  • 直接利用pip即可安裝:pip install Nuitka
  • 下載下傳​​vs2019​​(MSVS)或者MinGW64,反正都是C++的編譯器,随便下。如果電腦有這個環境可以不用下載下傳,可以先試試下面打包指令,如果不能打包就要安裝這個環境

    如上

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

3使用過程

先介紹打包簡單的exe程式指令:

nuitka --standalone --show-memory --show-progress   123.py      
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?
python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

打包時候有點久,等

打包完成,發現exe運作不了

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

并且體積也沒有減少多少

python 使用 `pyinstaller` 打包子產品指令打包出來的exe檔案太大了怎麼辦?

打包後的exe是運作不了的,要去這裡需要找到這些包(我的是在software\python3.7\Lib\site-packages下)複制(比如numpy,cv2這個檔案夾)到demo.dist路徑下

打包深度學習和機器學習一些庫多的py的時候,用下面方法,生成exe有自己指定圖表

對于第三方依賴包較多的項目(比如需要import torch,tensorflow,cv2,numpy,pandas,​​geopy​​等等)而言,這裡最好打包的方式是隻将屬于自己的代碼轉成C++,不管這些大型的第三方包!

以下是我demo的一個目錄結構(這裡使用了pytq5架構寫的界面):

├─utils//源碼1檔案夾├─src//源碼2檔案夾├─logo.ico//demo的圖示└─demo.py//main檔案      

使用以下指令(調試)直接生成exe檔案:

nuitka --standalone --show-memory --show-progress --nofollow-imports --plugin-enable=qt-plugins --follow-import-to=utils,src --output-dir=out --windows-icon-from-ico=./logo.ico demo.py      

這裡簡單介紹下我上面的nuitka的指令:

  • –standalone:友善移植到其他機器,不用再安裝python
  • –show-memory --show-progress:展示整個安裝的進度過程
  • –nofollow-imports:不編譯代碼中所有的import,比如​​keras​​,numpy之類的。
  • –plugin-enable=qt-plugins:我這裡用到​​pyqt5​​來做界面的,這裡nuitka有其對應的插件。
  • –follow-import-to=utils,src:需要編譯成C++代碼的指定的2個包含源碼的檔案夾,這裡用,來進行分隔。
  • –output-dir=out:指定輸出的結果路徑為out。
  • –windows-icon-from-ico=./logo.ico:指定生成的exe的圖示為logo.ico這個圖示,這裡推薦一個将圖檔轉成ico格式檔案的網站(比特蟲)。
  • –windows-disable-console:運作exe取消彈框。這裡沒有放上去是因為我們還需要調試,可能哪裡還有問題之類的。

經過1min的編譯之後,你就能在你的目錄下看到:

├─utils//源碼1檔案夾├─src//源碼2檔案夾├─out//生成的exe檔案夾
    ├─demo.build 
    └─demo.dist
        └─demo.exe//生成的exe檔案├─logo.ico//demo的圖示└─demo.py//main檔案      

當然這裡你會發現真正運作exe的時候,會報錯:no module named torch,cv2,tensorflow等等這些沒有轉成C++的第三方包。

這裡需要找到這些包(我的是在software\python3.7\Lib\site-packages下)複制(比如numpy,cv2這個檔案夾)到demo.dist路徑下。