使用 Pyinstaller 打包包含 pyqt5 库爬虫程序总结
python 和 pyinstaller 的安装不再赘述
使用 pyinstaller 的打包基本上使用一个 -F
参数即可,这样就会打包出一个单个可以运行的 exe;如果不指定,会打包出一整个文件夹
1. 碰见的第一个问题:RecursionError 递归报错
参考链接:
https://blog.csdn.net/heruili/article/details/97274443
发生此类异常原因:python默认的递归深度是很有限的(默认是1000),因此当递归深度超过999的样子,就会引发这样的一个异常,而在打包过程中引入的包递归深度可能比默认深度大,因此会引发异常。
pyqt5 这个库的递归深度可能比较深。
添加这个代码即可解决
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万
但是打包命令Pyinstaller -F XXX.py ,该在哪里加这部分代码并没有提及,通过大量查找终于发现了解决pyinstaller打包过程中出现该类异常解决的办法:
执行pyinstaller -F XXX.py 它会在你的目录文件生成XXX.spec文件,然后报错,出现该类异常。
打开XXX.spec文件,在开头添加上面两行代码。
继续执行打包,但是还文件名:pyinstaller -F XXX.spec ,执行该文件
2. 打包GUI程序指定 pyqt5 所在路径
参考链接:
https://www.cnblogs.com/DonetRen/p/10405395.html
打开cmd命令窗口,使用cd命令切换到.py文件所在路径,然后使用
pyinstaller --paths C:Users......Python37/Lib/site-packages/PyQt5/Qt/bin -F -w --icon=note.ico main.py
命令进行打包,
其中,–paths用来设置PyQt的环境变量,-F表示生成单个exe可执行文件,-w表示窗体程序,–icon是设置exe的显示图标,main.py是GUI程序的入口
3. 打包完成运行 exe 报错
参考链接:
https://blog.51cto.com/cfy10/2468597?source=dra
提示找不到模块
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
根据这个博客,问题可能出在各个模块之间版本不对应的情况,按照这个博主给出的配置
Python配置环境的版本。供大家参考
win10_64位 + python 3.6.8_64位 + Pywin32 227 + PyQt5 5.14.1 + opencv-python 3.4.5.20 + setuptools 44.0.0 + PyInstaller 3.6
win10_32位 + python 3.5.4_32位 + Pywin32 227 + PyQt5 5.14.1 + opencv-python 3.4.5.20 + setuptools 44.0.0 + PyInstaller 3.6
以上配置环境python包官网下载,模块均pip install自动安装依赖
对照后,降低 setuptools 的版本,打包成功可以运行
4. 未解决的问题
已经添加上了 -w
参数,不显示黑窗口,但是运行还是显示
pyinstaller 运行参数
与生成结果有关的参数
参数名 描述 说明
-D 生成one-folder的程序(默认) 生成结果是一个目录,各种第三方依赖、资源和exe同时存储在该目录
-F 生成one-file的程序 生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内
–specpath 指定.spec文件的存储路径 默认:当前目录
-n 生成的.exe文件和.spec的文件名 默认:用户脚本的名称,即main.py和main.spec
Windows和Mac特有的参数
参数名 描述 说明
-c 显示命令行窗口 与-w相反,默认含有此参数
-w 不显示命令行窗口 编写GUI程序时使用此参数有用。
-i 为main.exe指定图标 pyinstaller -i beauty.ico main.py