【tkinter】python工具pyinstaller打包生成exe檔案非常大的原因分析(openpyxl)openpyxl
【python】python的打包工具pyinstaller生成exe非常大的原因分析(openpyxl)openpyxl
-F 打包出來 一個一個都有200多m
from tkinter import * from tkinter.font import Font from email.mime.text import MIMEText from email.header import Header import tkinter import tkinter.messagebox import tkinter.simpledialog import tkinter.filedialog import openpyxl import smtplib import threading print(3*2)
每次刪掉一行,打包一個一個個包進行測試。發現有的包打出來沒什麼影響。
發現有一個包異常,只要有這個包,就是特別大---openpyxl
打包時間也特別長
檢查日誌:發現openpyxl 與 pandas numpy有關。
單獨將程式碼提出,用兩種方法呼叫,發現沒什麼卵用。
from openpyxl import load_workbook
#import openpyxl
workbook = openpyxl.load_workbook('data.xlsx')
都還是200多m
PyInstaller very big file size
win7(64bit)
anaconda ( 3 )
python(3.6)
pyinstaller (3.4.dev0+469f1fa19)
openpyxl (2.4.8)
I've made simple code like this:
------code------------------------------------------
#import openpyxl
workbook = openpyxl.load_workbook('data.xlsx')
------code------------------------------------------
File size (python files) is 1.0 KB.
But when I create executable using PyInstaller, I get 200 MB file!
About openpyxl..... Why the generated files are so big?
Is there a way to decrease file size?
在網上問了外國人,建議說是要安裝一個 python的虛擬機器器,因為我們安裝的是Anaconda,裡面很多庫連線進去了很多不必要的其他庫和包
有道理!
所以,乾脆用一臺筆記本,安裝純python3.6的環境。並單獨把openpyxl 單獨下下來,到時候有用。
裝好後,繼續用pip 把 pypiwin32 裝好。這裡有個坑:
要用 pip install pypiwin32, 而不是 pip install pywin32.
裝好後,按照一個不知名的方法,建議把這個 openxyl 解壓到pyinstall 的根目錄。等下要用。(好像有用)
然後把我的 py檔案要打包的。也放到 pyinstaller 根目錄。
pyinstaller -F mainGUIversion5.py 打包開始。
打包好後,發現竟然打包完成。 但是執行不了
直接到cmd視窗去執行,發現有少包,見下圖,缺什麼用pip裝什麼,這樣做,儘量不汙染python原生環境。
Need pure python environment!!!
No Anaconda
例如,這個是少了 jdcal包:
一次一次打包,一次次執行發現少包。
最後發現,ok了!!!! 最後一次打包為 不到8m了。 從200M直接壓縮到了 8M,任務完成。
執行也正常!
第二天開始做一個實驗:
看到底是包的問題,還是python 的問題,先將openpyxl包從pyinstaller目錄剪切出去,直接放到桌面,不刪掉:
執行後,發現打包可以,但是程式執行錯誤,提示“缺少openpyxl”。。錯誤找到了
於是 ,開始pip 安裝包。安裝後再執行打包。成功!
打包成功!
這麼多步驟與嘗試下來。得出結論。pyinstaller的正確打包有兩種方法:
第一種方法:將需要打包的程式和其所有依賴的包,統一放在pyinstaller的根目錄下,直接用-F打包即可成功,少一個包都不行!
第二種方法:安裝一個純淨的python環境,然後一步步測試pip,少哪個包就直接安裝哪個。
兩種方法各有千秋,但是推薦使用第二種方法,因為這種方法相對簡便,特別是在不清楚包之間的依賴關係的情況下。