2021-10-26用pyinstaller封装exe心路历程

用pyinstaller封装exe心路历程

    • 封装步骤
    • 遇到的问题
      • 问题1:dist文件夹为空,Module 'PyQt5' has no attribute '__version__'
      • 问题2:python.exe无法找到入口
      • 问题3:RuntimeError: Could not find the matplotlib data files
      • 问题4:RecursionError: maximum recursion depth exceeded
      • 阶段性成果
      • 问题5:打包出的exe文件太大了
      • 问题6:虚拟环境打包的文件依然很大
    • 最终的结果

首先说一下感受,这几天一直在琢磨这件事,原本以为是很简单的,按照步骤操作就行,结果几乎每一个步骤都在出问题,而且解决了前一个问题,又会冒出别的问题。不过真的要感谢网上的各路前辈、大神,各位的文章帮我解决了一个又一个困难,最终成功实现了封装。

封装步骤

1.安装pyinstaller;
2.将要打包的python文件(假设叫test.py)放在一个文件夹中;
3.cmd切换至该文件夹;
4.执行命令:pyinstaller -F test.py;
5.等待命令执行完毕后,文件夹中会生成一个新文件夹叫dist,打包好的exe文件就在其中,完成。
封装的步骤,主要参考这篇文章(我反复读了很多遍):
https://blog.csdn.net/cainiao_python/article/details/112791490?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242.0
图片来源于上述链接文章的截图

遇到的问题

按照步骤安装好了pyinstaller,然后打包我写的一个testapp.py文件,结果在生成的dist文件里并没有出现testapp.exe。这就比较尴尬了。因为按照步骤去做但结果不如人意,压根不知道问题出在哪。
从头开始,把要打包的py文件换成了最简单的hello.py,也就是直接打印hello world。唉你猜怎么着,居然成功了!那是不是问题出在我写的这个python文件里。但我依然不知道我哪里写的不对。

问题1:dist文件夹为空,Module ‘PyQt5’ has no attribute ‘version

通过查看CMD窗口的代码,发现了一个问题:Module ‘PyQt5’ has no attribute ‘version’。
解决办法
搜索之后发现一篇文章(见下方链接)提到:之前安装pyinstaller用的是pip命令,而pip命令安装的依赖和使用conda命令安装的依赖不完全互通。按照博主的指示,用conda命令执行安装pyinstaller。
参考文章:https://blog.csdn.net/qq_39735940/article/details/11893115
2021-10-26用pyinstaller封装exe心路历程_第1张图片

问题2:python.exe无法找到入口

进行相应的操作后(用conda命令重新安装pyinstaller),出现了另一个问题:python.exe无法找到入口,无法定位程序输入点(说实话这个时候内心有点崩溃)。继续重复之前的步骤,网上搜索问题,然后试图解决问题。
解决办法
参考了这篇文章:https://blog.csdn.net/qq_41185868/article/details/103557501
但是问题没有解决,因为anaconda\envs下没有pytorch这个文件夹(后来学习了虚拟环境以后才明白原因,我电脑上根本没创建过虚拟环境)。所以又继续找,最终在一篇需要会员权限下载的文章里找到了解决办法(如下图)。其实原理跟上面链接里写的一样,只是因为我没有虚拟环境。
2021-10-26用pyinstaller封装exe心路历程_第2张图片

问题3:RuntimeError: Could not find the matplotlib data files

上述问题解决后,出现了一个问题:RuntimeError: Could not find the matplotlib data files。
解决办法
卸载matplotlib,重装,打包,修改spec文件,重新打包spec文件
参考这篇文章:
https://blog.csdn.net/kobeyu652453/article/details/108871179
2021-10-26用pyinstaller封装exe心路历程_第3张图片

问题4:RecursionError: maximum recursion depth exceeded

上述问题解决之后,又出现了新的问题:RecursionError: maximum recursion depth exceeded。
解决办法
在生成的spec文件中,添加:
Import sys
Sys.setrecursionlimit(50000)
再次执行pyinstaller -F filename.spec
参考了两篇文章:
https://blog.csdn.net/jusang486/article/details/82383256
和:https://blog.csdn.net/xiqi4145/article/details/103875917
2021-10-26用pyinstaller封装exe心路历程_第4张图片

阶段性成果

终于,在完成上述步骤后,成功打包出了一个exe文件,并且在将其拖到终端运行后,成功了!!!但有一个问题,这个exe文件超级大,有372M,想要将这个文件发给别人是不太可能的,遂继续搜索。

问题5:打包出的exe文件太大了

解决办法
创建一个虚拟环境,在这个虚拟环境中打包。
参考(又回到最初封装步骤的那篇文章):
https://blog.csdn.net/cainiao_python/article/details/112791490?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242.0

问题6:虚拟环境打包的文件依然很大

按照上述步骤操作后,成功创建了一个虚拟环境,并且在这个环境中打包,然而打包出来的exe依然是372M,丝毫没有变小。继续搜索。
解决办法
问题出在,在虚拟环境中没有安装pyinstaller,所以打包时调用的仍然是conda自带环境中的pyinstaller。
参考这篇文章:https://blog.csdn.net/qq_37261711/article/details/120435327
2021-10-26用pyinstaller封装exe心路历程_第5张图片

最终的结果

最后,在完成上述步骤后,成功实现了打包,并且文件只有11M。发送给没有安装过python的同事,可以正常运行。
因为我不是计算机相关专业毕业,所以没有建立这一系列的知识体系,总是东学一块西学一块,这应该也是导致这次曲折经历的重要原因。不过好在有各路大神的细心解答,最终才能完成这个小小的项目。All’s well that ends well,还是很开心的。

你可能感兴趣的:(python,pyinstaller,封装,exe)