spyder 如何打包输出_Python: pyinstaller打包exe(含file version信息)

最近项目上一直都是用Spyder直接运行.py文件的方式来执行每日的自动化程序,每天都要手动去点击Run来执行一次,所以考虑把.py文件直接打包成exe,然后用windows的task schedule功能来让它自动每天运行。

用pyinstaller来打包exe文件,同时为了便于维护,给exe文件添加文件版本file version信息。

1. 安装pyinstaller

机器上的python环境是直接安装的Anaconda软件,所以直接打开“Anaconda Prompt”来安装pyinstaller,运行命令:pip install pyinstaller。(如果提示有其他相关的组件xxxx缺失,用相应的方式来安装就好: pip install xxxx)

2fb46c03806116680bde9a0843452c81.png

2. 设置文件版本信息

为了方便版本管控,最好是给每次打包发布的exe文件设置文件版本信息——右键点击exe查看属性中的详情信息中可以看到版本信息。

方法一:

进入pyinstaller的此目录PyInstallerutilscliutils下(如果不知道路径可以通过去全盘查询cliutils来找到相应的文件夹,此处安利一款window上的文件查询小软件——Everything:https://www.voidtools.com/zh-cn/downloads/,查询速度超级快!)

你会看到如下几个文件:

60d0ba31e37c1cafd7140efbc1eb7fdc.png

其中的grab_version是用来捕获一个exe文件的版本信息并自动在同一目录下输出一个file_version_info.txt文件版本信息的,其中set_version是用来给一个exe文件赋值版本信息的,用法分别如下:

1. 进入cmd界面
2. 将目录转移到C:ProgramDataAnaconda3Libsite-packagesPyInstallerutilscliutils下
3. 拷贝一个要获取版本信息的exe文件到这个目录下
4. 在cmd窗口键入:python grab_version.py filename.exe
5. 目录下会自动出现一个标准的file_version_info.txt文件,双击打开,按照相应的需求修改
6. 在cmd窗口键入:python set_version.py file_version_info.txt youfilename.exe即可

方法二:

在打包的时候就已经准备好了版本信息文件:file_version_info.txt
打包时用此参数--version-file 即可:pyinstaller --version-file file_version_info.txt test.py

最后打包成exe,可以右键点击exe文件查看详细信息,可以看到有文件版本信息。

7c771937d2926d58df0f13508079a58e.png

3. 运行pyinstaller来打包exe

一般用pyinstaller打包exe会用到-F参数(表示打包成一个EXE文件)或者--version-file(给exe文件赋予版本信息),其他参数如需了解,可以输入pyinstaller -h来获取帮助信息。

b82929e76d9105e00f1b5c7d300fede0.png

比如需要打包test.py文件为exe,用如下方式:

5adab64e7ee684402395376bd47fefe7.png

4. 打包exe过程中遇到的问题:

一般来说,如果是机器上组件缺失导致打包失败,安装相应的组件即可。

我也遇到了2个比较特殊的问题:

问题1: 打包提示报错:Cannot find existing PyQt5 plugin directories

90910b634a70c64d7447caf59bd6171b.png

解决方法:创建PyQt5 plugin的路径,按报错的路径来新建,然后将本来pyqt文件加中的pyqt5qmlplugin.dll文件拷贝放入此路径即可。

  1. 先查询机器是上否有安装pyqt以及文件夹,可以用Anaconda Prompt中输入conda list来查看机器上的pyqt的版本以及路径信息(同理,也可以用Everything来查询此dll文件来定位到文件夹路径)。

0c293dd1537b575ddc8f0fd0b85fdb34.png

58552e6befa503a6fc3f1959c3062456.png

2. 新建报错中提到的路径,同时把dll文件拷贝进去。

c5f3bbee986a7eb7f90919ecd741064e.png

再次打包运行就不会再报此错误了。

问题2:打包提示报错:RecursionError: maximum recursion depth exceeded

444cdbf727eca8368f083c12090b025d.png

解决方法:因为python在处理循环的时候是手限制的,所以解除此限制即可

5449a4611ef6e0dea72fe9140bed71bf.png


在打包文件夹中找到新生成的spec文件(比如test.spec),然后在该文件最上面添加如下2行来重定义循环次数即可;再运行此spec文件来打包即可:

import sys 
sys.setrecursionlimit(5000)

1446435a8b9ddbee284878602adf5fab.png

版权声明:本文为weixin_36402765原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。