Pyinstaller打包包含matplotblit模块的程序

Pyinstaller打包含matplotblit模块的程序

2018/6/3

pyinstaller是个好东西,它是用来对python脚本进行打包生成可执行程序.exe的外部工具。

最简单下载该工具的方式是:pip install pyinstaller

然后在命令行中进入待打包的python工程下,执行pyinstaller -F -w test.py

其中-F表示只生成一个独立的可执行程序.exe ,-w表示在运行程序是不出现那个黑黑的dos界面。

然后就可以愉快的在工程文件夹下看到一个dist文件夹,其中有你想要的exe文件。

是不是很简单,然而上面的套路只适用于简单的python程序。

这次写迷宫生成程序,用到了pyqt做界面,这不是主要的。最主要的是用到了matplotlib模块来展示迷宫图片。本来挺好的一件事情,又新学了一个模块,然而。出bug了。

在我按照上面的套路生成exe文件时,一直报错:

for field,value in iter_fields(node):

RecursionError:maximum recursion depth exceeded(递归深度超出最大限制)

百思不得其解,经过一系列的实验,发现matplotlib是“毒瘤”。当去掉代码中所有的matplotlib包时,可以正常打包。
最后在StackOverflow上找到了答案,因为pyinstaller在生成exe文件时,需要去找代码中用到的所有依赖,而在找matplotlib的包时,需要先去调用很多其他的包,所以就会产生大的递归深度,并且该深度超过了系统代码默认设置,所以跳出来报错。

解决的办法:

曲线救国,先生成spec文件(这是从.py到.exe的中间途径,即使不可以去生成,最后也会出现这个文件。)

具体方法如下:

Create a spec file

pyi-makespec [options] name.py  

Modify this spec by adding to start of file

import sys
sys.setrecursionlimit(5000) # or more

Build the executable file

pyinstaller options name.spec 

按照上面的操作,迎刃而解。

具体链接如下:https://stackoverflow.com/questions/30677110/pyinstaller-and-matplotlib-gets-maximum-recursion-depth-exceeded

用了一天的时间解决了这个问题,一开始看到报错,一脸懵逼,以为我又遇到了玄学。其实肯定又解决方法的,幸亏我坚持了下来,终于找到了它。虽然被这个问题困扰了一天,但最终还是解决了,挺开心的。也挺有收获的。

猜你喜欢

转载自blog.csdn.net/weixin_39986952/article/details/80556123