pyqt5单个exe实现自更新的技巧
关于打包
pyqt5程序,很多人一直用pyinstaller打包,我也一直在用,可以打成【单个exe可执行文件】,也可以打成【免安装绿色文件夹】。
相关pyinstaller的文章教程网上很多,大家自行搜索,我自己也写过几篇,大家可以参考下:
《【爬坑】python3+pyqt5+pyinstaller的各种问题》
《pyinstaller利用spec文件打包的使用模板》
关于更新
软件更新 ,常见多是Update.exe + 主程序.exe,为什么呢?
因为一个程序不可能在自身运行的时候把自身更新掉,所以才通过Update.exe来更新主程序.exe,像很多端游的登陆界面,其实就是个版本更新器,就是Update.exe。
但我们pyqt5经常就是打成单个exe可执行文件,又不想另外加个Update.exe程序,怎么办?
问题转化一下,就是:pyqt5的单个exe可执行文件,如何实现自更新呢?
其实解决思路,稍微想想,大家都有,我采用这样:
步骤1:使用老的 主程序.exe,下载新的 主程序.exe,放在一个自定义的更新目录。
步骤2:关闭老的 主程序.exe
步骤3:删除老的 主程序.exe
步骤4:复制新的 主程序.exe,到老的 主程序.exe的目录位置
有了这样解决思路,如何实现呢?如何做得漂亮呢?
这里借鉴了这个大神的文章《Winform单个exe实现自更新的技巧》
这里面用到了vbs脚本,通过vbs脚本做一些自动化的处理。
然后,解决方案,具化一下,是这样:
步骤0.预先编辑保存好vbs文件
步骤1.点击更新按钮,然后下载新的 主程序.exe和vbs文件,一起放在更新目录下。
步骤2.下载完毕后,运行vbs文件
步骤3.vbs文件运行中.......关闭老的 主程序.exe
步骤4.vbs文件运行中.......删除老的 主程序.exe
步骤5.vbs文件运行中.......复制新的 主程序.exe,到老的 主程序.exe的目录位置
步骤6.vbs文件运行中.......打开新的 主程序.exe
步骤7.vbs文件运行中.......已经完事了,还想干什么,自己按需加吧
核心代码
主程序.exe和vbs文件,下载完,得运行vbs文件吧,python是这样运行vbs文件的
import subprocess
CREATE_NO_WINDOW = 0x08000000 #不加这个,会有cscript窗口,不好看
subprocess.call("cscript update.vbs", creationflags=CREATE_NO_WINDOW)
update.vbs 脚本代码,如下
Dim wsh
Set wsh = WScript.CreateObject("WScript.Shell")
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
DesktopPath = wsh.SpecialFolders("Desktop")
UpdatePath = "C:\mysoft_update"
'清除老程序进程
wsh.Run "taskkill /f /im mysoft.exe",0
WScript.Sleep(2000)
'删除老程序
If fso.fileExists(DesktopPath & "\mysoft.exe") Then
fso.DeleteFile(DesktopPath & "\mysoft.exe")
WScript.Sleep(2000)
End If
'复制新程序到桌面
If fso.fileExists(UpdatePath & "\mysoft.exe") Then
fso.CopyFile UpdatePath & "\mysoft.exe", DesktopPath & "\mysoft.exe"
WScript.Sleep(2000)
End If
'运行新程序
If fso.fileExists(DesktopPath & "\mysoft.exe") Then
wsh.Run DesktopPath &"\mysoft.exe",false,false
End If
'最后的处理
Set fso=NoThing
WScript.quit
Set wsh=NoThing
WScript.quit
写在最后
好了,这事情基本就这样了,我也花了半天,才学会了这几句vbs,大家拿去用吧
整个事情,当然还有其他代码,不过太长,这里贴不下的,自己文章多看看,拼一拼吧
如果下载功能这块不知道怎么写,看我这边文章,抄一抄,拼一拼就好
我写的文章,一般都是百度搜不到的资料,我觉得大家需要,就专门写下,希望对大家有帮助
欢迎大家,点赞,关注,留言,以表支持......谢谢!