Pyinstaller打包含matplotblit模块的程序
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
按照上面的操作,迎刃而解。
用了一天的时间解决了这个问题,一开始看到报错,一脸懵逼,以为我又遇到了玄学。其实肯定又解决方法的,幸亏我坚持了下来,终于找到了它。虽然被这个问题困扰了一天,但最终还是解决了,挺开心的。也挺有收获的。