今天的主角依然是pyinstaller打包工具,為了讓pyinstaller打包后exe文件不至過大,我們的py腳本文件引用庫時盡可能只引用需要的部分,不要引用整個庫,多使用“from *** import **,**”語句,如:
from openpyxl import load_workbook,Workbook from openpyxl.styles import Border,Side,Alignment,Protection,Font,GradientFill,Color from easygui import msgbox from pandas import DataFrame,ExcelWriter,read_excel
在打包py文件時還是會遇到其他問題:
1、64位windows python上打包的程序 或 不能在32位上運行,反之卻可以。如果你的客戶群都是32位windows,建議你的虛擬機vmware下開發環境使用32位windows以及32位的python開發環境,避免不必要的麻煩。
2、我們的很多涉及到科學計算的腳本文件都要借助pandas,Numpy這兩個庫:
pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標准的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
用pyinstaller在打包含pandas庫的py文件時依然會出現問題,有可能可以生成exe文件,但是程序無法正常執行,閃退:
參考答案::pyinstaller-and-pandas
我們先用正常方法打包一遍py文件,之后會自動生成.spec后綴的文件,我們需要用文本編輯器對spec文件進行更改,好讓pyinstaller能正常引用到pandas庫:
在spec文件內,定義一個方法來取得pandas文件路徑:
def get_pandas_path(): import pandas pandas_path = pandas.__path__[0] return pandas_path
還需要在a=Analysis代碼段下添加以下代碼:
dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"]) a.datas += dict_tree a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)
如,本人編寫的一個簡單的excel表格拆分工具“table_spliter_V0.91_sort.py”,其中運用了pandas的DataFrame類下的sort方法,對excel文件進行多條件排序,我們對spec文件進行更改后如下:
# -*- mode: python -*- block_cipher = None def get_pandas_path(): import pandas pandas_path = pandas.__path__[0] return pandas_path a = Analysis(['table_spliter_V0.91_sort.py'], pathex=['D:\\'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"]) a.datas += dict_tree a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='table_spliter_V0.91_sort', debug=False, strip=False, upx=True, runtime_tmpdir=None, console=True , icon='photo.ico')
再在PowerShell下用pyinstaller執行打包時,需要這樣寫:
pyinstaller table_spliter_V0.91_sort.spec --onefile
生成的exe文件可以正常執行,大功告成,不過生成的exe文件依然較大,有32Mb,下次希望能找到更好的方法壓縮exe文件大小。
當然,后期會研究下這兩種“py文件封裝exe”方法: