最近同事使用python写了一个在公司内部使用的 C/S 架构的软件,主要功能在服务端完成。通过pyinstaller 生成 exe的客户端,希望能够给客户端增加版本校验自动升级功能
在这里记录下实现的过程
升级思路:
1. 下载新版软件
2. 关闭当前运行的旧版软件
3. 删除旧版软件
3. 启动新的软件
网上搜索了下,大多数的实现方式都是使用2个exe,来完成。
在这里我不想使用2个exe,决定太麻烦
参照网上 http://bbs.csdn.net/topics/30359845 做了一个python版的实现。
实现思路:
当前进行下载完文件后,写一个bat脚本,启动脚本,然后退出。
脚本完成删除旧程序,运行新程序的功能。
如果要求不改变exe的名字,可以在脚本中加一句改名字的操作,将旧程序删除后,将新程序改为旧程序的名字,再启动新程序。
新程序启动后,将旧程序遗留的脚本删除。
import os
import sys
import subprocess
#编写bat脚本,删除旧程序,运行新程序
def WriteRestartCmd(exe_name):
b = open("upgrade.bat",'w')
TempList = "@echo off\n"; #关闭bat脚本的输出
TempList += "if not exist "+exe_name+" exit \n"; #新文件不存在,退出脚本执行
TempList += "sleep 3\n" #3秒后删除旧程序(3秒后程序已运行结束,不延时的话,会提示被占用,无法删除)
TempList += "del "+ os.path.realpath(sys.argv[0]) + "\n" #删除当前文件
TempList += "start " + exe_name #启动新程序
b.write(TempList)
b.close()
subprocess.Popen("upgrade.bat")
sys.exit() #进行升级,退出此程序
def main():
#新程序启动时,删除旧程序制造的脚本
if os.path.isfile("upgrade.bat"):
os.remove("upgrade.bat")
WriteRestartCmd("newVersion.exe")
if __name__ == '__main__':
main()
sys.exit()
代码中不使用os.system()是因为 这个函数会阻塞,等待bat脚本操作完成后,才会继续执行。不适合此处场景