• 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)
    
    • 1
    • 2
    • 3

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    写在最后

    好了,这事情基本就这样了,我也花了半天,才学会了这几句vbs,大家拿去用吧

    整个事情,当然还有其他代码,不过太长,这里贴不下的,自己文章多看看,拼一拼吧

    如果下载功能这块不知道怎么写,看我这边文章,抄一抄,拼一拼就好

    《pyqt5的下载进度条-实现模板》

    我写的文章,一般都是百度搜不到的资料,我觉得大家需要,就专门写下,希望对大家有帮助

    欢迎大家,点赞,关注,留言,以表支持…谢谢!

  • 相关阅读:
    org.springframework.test.util.ReflectionTestUtils.invokeMethod方法的使用
    羧甲基-β-环糊精/Fe3O4纳米复合物|环糊精修饰四氧化三铁纳米复合材料|齐岳
    百日刷题计划 ———— DAY2
    R语言作业wine 数据
    [论文阅读笔记69]医学术语标准化-CODER
    spring报错 @EnableAsync annotation metadata was not injected
    python--字典和列表
    【区块链 | OpenZeppelin】OpenZeppelin 7个最常使用的合约
    【2024_CUMCM】熵权TOPSIS方法
    【空间-光谱联合注意网络:多时相遥感图像】
  • 原文地址:https://blog.csdn.net/qq_20265805/article/details/126896921