zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    PowerDesigner学习 ---- 系列文章
    PowerDesigner基础使用 ---- 入门学习
    PowerDesigner ---- 数据库设计(概念模型CDM和物理模型PDM)
    PowerDesigner V16.5 安装及汉化
    在树莓派是安装并配置NTP服务
    RESTful Web API 理解
    Linux或树莓派3——挂载U盘、移动硬盘并设置rwx权限
    开启树莓派自带的VNC功能
    c#代码获取web.config配置文件里面设置的 <compilation debug="true"节点
    WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式
  • 原文地址:https://www.cnblogs.com/new-june/p/9298857.html
Copyright © 2011-2022 走看看