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

 # -*- coding: utf-8 -*-
from distutils.core import setup
import py2exe
import glob
import sys
sys.setrecursionlimit(10000000) # 在命令行下运行 python setup.py py2exe setup(
options={
"py2exe":{
"includes":["sip",
"matplotlib.backends",
"matplotlib.figure",
"matplotlib.backends.backend_tkagg"
],
"dll_excludes":["MSVCP90.dll", 'libopenblas.JKAMQ5EVHIVCPXP2XZJB2RQPIN47S32M.gfortran-win32.dll'],
"compressed":1,
"optimize":2,
# "bundle_files":1
}
},
version = "0.1.0",
description = "PID Debug",
name = "PID",
zipfile=None,
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\*.*'))],
windows=[{"script":'main.py',
"icon_resources":[(1, "3.ico")]
}
]
)

setup.py

通过py2exe打包python程序的过程中,解决的一系列问题的更多相关文章

  1. Python学习笔记:py2exe打包Python程序

    使用py2exe将一个Python程序打包成一个exe程序,这样Python程序也可以在没有安装Python的环境中运行Python程序了.使用这个工具需要写一个用于打包的setup.py文件(名称可 ...

  2. 使用 py2exe 打包 Python 程序

    上回在<使用 PyInstaller 打包 Python 程序>中,我们介绍了使用 PyInstaller 对 Python 程序进行打包,今天带大家认识一个新的工具:py2exe. 接下 ...

  3. “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误

    在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...

  4. PyInstaller 打包 python程序成exe

    pychaim下PyInstaller 打包 python程序 主题是使用PyInstaller 打包python时遇到一些问题以及解决方案,其中将要打包的程序是用tensorflow做的LSTM算法 ...

  5. (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?

    转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...

  6. Python使用Mysql过程中一些错误

    Python使用Mysql过程中一些错误 ssh登录远程服务器 ssh ubuntu@xxx.xxx.xx.xx 第一:ubuntu终端中登录Mysql mysql -uroot -p 然后输入密码即 ...

  7. 关于webapi练习过程中遇到的一系列问题记录

    最近在尝试本地进行webapi调用的过程中,遇到一系列的问题,demo很小但着实让人头疼,先附上demo. 前台页面,目的是展示新闻的分类: 类别模型如下: 控制器代码如下: public Actio ...

  8. 使用py2exe将python程序打包成exe程序

    近日帮朋友写了个python小程序,从互联网上抓取一些需要的文章到本地.为了运行方便,希望能转换成exe程序在windows下定期执行.从百度上找了些文章,发现py2exe的应用比较多,遂使用之. 1 ...

  9. 【Python开发】PyInstaller打包Python程序

    PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX.并且很多包都支持开箱即用,不依赖环 ...

随机推荐

  1. html css:背景图片链接css写法

    图片作为背景,并且是链接的写法.例如网站的logo图片.例如:土豆的logo图片 <a title="土豆网 tudou.com 每个人都是生活的导演" href=" ...

  2. 用批处理在windows中导出/导入无线网络信息,复制保存为bat即可

    @echo offtitle 在windows中导出/导入无线网络信息 :Beginecho ========================echo 请选择操作:echo 1 查看可用的无线网络ec ...

  3. 【洛谷5294】[HNOI2019] 序列(主席树维护单调栈+二分)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(A\),每次询问修改一个元素(只对当前询问有效),然后让你找到一个不下降序列\(B\),使得这两个序列相应位置之差的平方和最小,并输出这个最小 ...

  4. PHP设计模式——工厂模式

    <?php /** * 工厂模式 * 提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤. * * 工厂类用于创建不同类的实例,并将其返回. */ /** * 服务端 ...

  5. 【luogu P1972 [SDOI2009]HH的项链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1972 真是不懂为什么要卡莫队! #include <cmath> #include <cs ...

  6. js 事件委托 事件代理

    JavaScript高级程序设计上解释:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 通过例子类比: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三 ...

  7. 记录一次LOB损坏导致的EXPDP导出ORA-01555报错

    同事导出数据,结果遇到如下报错: expdp user1/XXXXXXXX directory=szdata1 dumpfile=szhzinfo_20180319.dmp logfile=szhzi ...

  8. [Linux/Unix]常用命令

    1.查看日志后200行有“TNS字符串的详细信息 file_name |grep TNS 实时查看文件情况: tail -f file_name 2.查看路由情况: #Linux环境 tracerou ...

  9. java实现简单计算器功能

    童鞋们,是不是有使用计算器的时候,还要进入运行,输入calc,太麻烦了,有时候甚至还忘记单词怎么拼写,呵呵程序员自己写代码实现,又简单,又方便啊 以下为代码(想要生成可执行工具可参考:http://w ...

  10. 并查集(union-find sets)

    一.并查集及其优化 - 并查集:由若干不相交集合组成,是一种简单但是很好用的数据结构,拥有优越的时空复杂性,一般用于处理一些不相交集合的查询和合并问题. - 三种操作: 1.Make_Set(x) 初 ...