- A+
所属分类:python实战案例
python写的gui程序通过pyinstaller打包,形成单一文件的应用程序或者绿色免安装的文件夹形式应用程序,在需要版本升级时比较麻烦。简单的操作是直接提示一个下载链接让用户自己去下载升级解压运行,如果想实现程序自动升级则涉及多个步骤。这里详解介绍自动升级的思路以及不被360报毒的注意要点。
首先,程序在启动时后台线程请求网址获取到最新程序的版本号以及下载地址,比对当前程序的版本号与最新版本号,如果需要升级就让主程序下载最新的压缩包并解压出压缩包中的update.exe更新程序到根目录,然后运行更新程序,退出主程序。
其次,更新程序运行后在其中执行的操作是解压出压缩包中的相应文件并比对当前根目录中的文件,特别是明确要更新的文件,而那些不需要更新的可以直接跳过不解压,这样做的好处是避免大量的删除文件引起360误杀。
- def del_all_contents(self):
- """文件夹"""
- # 遍历源目录中的所有文件和子目录
- time.sleep(0.5)
- try:
- with zipfile.ZipFile(self.zip_filepath, 'r') as zip_ref:
- fillist = zip_ref.filelist
- for file in fillist:
- file_name = file.filename
- file_size = file.file_size
- if file_name == 'upd.exe':
- continue
- local_filepath = os.path.join(self.root_path,file_name.replace('/','\\'))
- if os.path.isfile(local_filepath):
- local_filesize = os.path.getsize(local_filepath)
- if local_filesize==file_size:
- pass
- else:
- os.remove(local_filepath)
- zip_ref.extract(file_name,path=self.root_path)
- else:
- zip_ref.extract(file_name, path=self.root_path)
- except Exception as e:
- self.write_log(f'移动文件时出现错误:{e}')
- sys.exit(77)
再次,更新程序删除替换了文件后就弹出提示框执行启动新的主程序并退出更新程序,主程序运行后删除掉更新程序。
经过这样一个循环后主程序完成自动升级,主程序使用文件夹的形式打包,而update.exe更新程序则采用单一文件打包。
之前更新程序采用移动、复制、替换等等多种方式都容易被360报毒,即使非常简单的代码都可能出问题,现在只需要删除少量的原文件,解压出新的文件即可。
程序不被360误杀主要是:1.主程序下载新程序压缩包时采用分片下载,2.更新程序避免执行大量移动复制替换文件的操作,3.更新程序在启动新程序时提前弹框消息提醒确认升级。通过这几种改进目前程序自动升级无异常报毒的问题。

我的微信公众号
爱真理,得永生! 爱在灵灵久博客,网罗天下,福利大家!