Python Pyinstaller打包含pandas庫的py文件遇到的坑


  今天的主角依然是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、64windows 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”方法:

py2exe

cx_Freeze

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM