Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 582|回复: 0

通过py2exe打包python程序的过程中,解决的一系列问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-7 01:07:30 | 显示全部楼层 |阅读模式

    py2exe的使用方法参考《py2exe使用方法》

    注:程序可以在解释器中正常运行,一切问题都出在打包过程中。

    问题1:

    • 现象:RuntimeError: maximum recursion depth exceeded in comparison.
    • 原因:Python递归报错。Python中默认的最大递归深度是989,当尝试递归第990时便出现递归深度超限的错误。
    • 解决:在setup.exe中手动设置递归调用深度为10000000,代码如下:
        • import sys
          sys.setrecursionlimit(10000000)

    问题2:

    • 现象: import _tkinter ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。 
    • 原因:python解释器版本与tkinter版本不一致。可能是安装了多个python解释器,或者tkinter不是用pip安装、导致其版本与python解释器版本不一致。(本次遇到的情况属于后者)
    • 解决:安装对应版本的python解释器(2.7.10)

    问题3:

    • 现象: [Errno 2] No such file or directory: 'libopenblas.IPBC74C7KURV7CB2PKT5Z5FNR3SIBV4J.gfortran-win_amd64.dll' 
    • 解决:在setup.py的setup-options中,dll_excludes下添加 'libopenblas.JKAMQ5EVHIVCPXP2XZJB2RQPIN47S32M.gfortran-win32.dll' ,排除这个dll文件

    至此,已经可以打包完成,但打包后的exe无法运行。

    问题4:

    • 现象:运行exe时弹出命令行窗口报错,之后在log中发现报错原因: ImportError: No module named mpl_toolkits. 
    • 尝试:中间尝试过在setup.py的setup-options中添加"includes"或"packages"指令,打包时就指定必须导入这个模块。这样的结果就是,打包过程中就出现上述报错,无法完成打包。下文“引申”中的两种方法也尝试过了,都无法解决问题。
    • 解决:仔细查看程序,发现其实不需要用到mpl_toolkits包,于是注释掉mpl_toolkits的导入。
    • 引申:搜索发现这种问题还是比较普遍的,主要的解决方式有两种,以后再出现这个错误时可以尝试这些解决方法(这次的问题这两个方法都无法解决):
      1. 认为原因在于py2exe无法识别运行时的动态导入,解决办法是在文件头就import相关模块(也有人建议,在这个办法的基础上,import部分结束之后,显式地调用一次这个模块,比如xxxx.__version__)
        • 【原地址:https://bytes.com/topic/python/answers/168576-help-py2exe-error-no-module-named-decimal】
      2. 认为原因在于py2exe无法识别egg文件。他的解决办法是: 我发现python的Lib/site-packages下安装的是egg文件,beautifulsoup4-4.4.0-py2.7.egg。用winrar将其解压,把bs4目录直接放到Lib/site-packages下,再打包并执行,一切正常。问题解决。 
        • 【原地址:https://www.cnblogs.com/simplestupid/p/4716658.html】

    问题5:

    • 现象:RuntimeError: Could not find the matplotlib data files.
    • 原因:matplotlib运行时缺失一些必要的文件。
    • 解决:在setup.py的setup-options-includes中添加
    • "matplotlib.backends",
      "matplotlib.figure",
      "matplotlib.backends.backend_tkagg"

     

    在setup.py的setup中添加

    • data_files = [(r'mpl-data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\*.*')),
                    (r'mpl-data', [r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']),
                    (r'mpl-data\images', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\images\*.*')),
                    (r'mpl-data\fonts', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\*.*'))]

    问题6:

    • 现象:OMP: warning #178:Function GetModuleHandleEx failed:   OMP: System error #126: 找不到模块
    • 解决:在setup.py的setup-options中,取消 "bundle_files":1,不再将所有文件打包到一个exe中。
    • 引申:这个问题出现于用py2exe打包、含numpy包,且把所有文件打包到一个exe中的时候。值得参考的解决方法是: 在setup.py的setup-options中excludes("scipy"和)"numpy",并将它们的整个包文件夹复制到dist目录中,并将该目录添加到python main.py顶部的系统路径中 。
      • 【原地址(关于此报错的一些讨论):https://stackoverflow.com/questions/22412984/omp-warning-when-numpy-1-8-0-is-packaged-with-py2exe】

     附:最终的setup.py

     1 # -*- coding: utf-8 -*-
     2 from distutils.core import setup
     3 import py2exe
     4 import glob
     5 import sys
     6 sys.setrecursionlimit(10000000)
     7 
     8 # 在命令行下运行  python  setup.py  py2exe 
     9 
    10 setup(
    11     options={
    12        "py2exe":{
    13             "includes":["sip",
    14                         "matplotlib.backends",
    15                         "matplotlib.figure",
    16                         "matplotlib.backends.backend_tkagg"
    17                         ],
    18             "dll_excludes":["MSVCP90.dll", 'libopenblas.JKAMQ5EVHIVCPXP2XZJB2RQPIN47S32M.gfortran-win32.dll'],
    19             "compressed":1, 
    20             "optimize":2, 
    21             # "bundle_files":1
    22         }
    23     },
    24     version = "0.1.0", 
    25     description = "PID Debug",
    26     name = "PID",
    27     zipfile=None,
    28     data_files = [(r'mpl-data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\*.*')),
    29                   (r'mpl-data', [r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']),
    30                   (r'mpl-data\images', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\images\*.*')),
    31                   (r'mpl-data\fonts', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\*.*'))],
    32     windows=[{"script":'main.py',
    33                      "icon_resources":[(1, "3.ico")]
    34                     }
    35                 ] 
    36 )
    setup.py

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 03:35 , Processed in 0.055941 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表