有一个需求:
因为软件在不断更新,需要客户所使用的的客户端软件,能够自动检测版本更新,并在客户允许的情况下自动进行文件的下载和安装
主要步骤有以下:
1、客户端软件开发一个模块,以独立线程的形式在主程序启动时进行检测,判断是否有新版本,如果有,在主界面以弹窗的形式告知用户
2、搭建一个服务器,提供版本检测和最新版本软件下载的功能
3、编写一个单独的更新程序,主程序调用更新程序进行下载并更新
具体步骤可参考链接:https://toutiao.io/posts/okj44ae/preview
一、客户端检测:
import requests
import os
sm_version = '1.5.3'
# 检查客户端版本
def check_update():
try:
url = 'http://127.0.0.1/version'
resp = requests.get(url)
resp.encoding = 'UTF-8'
if resp.status_code != 200:
print('【版本检测】服务器连接失败')
return False
if resp.text == c_version:
print('【版本检测】客户端版本正常')
return True
print('【版本检测】客户端版本过低,启动自动更新程序?')
except Exception as e:
print('【版本检测】网络错误')
return False
# 开始运行
check_update()
二、服务器部署
from flask import Flask, request, send_file
n_version = '1.5.3'
app = Flask(__name__)
# 版本查询
@app.route('/version', methods=['GET'])
def get_version():
return n_version
# http://192.168.71.27:80/version
# 获取最新文件
@app.route('/update/app', methods=['GET'])
def update_app():
# 新版本文件路径
file_path = "G:/软件源文件/{}.ppt".format("有个性的羊")
return send_file(file_path)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80, debug=False)
三、第三方更新程序
import os
import shutil
import psutil
import requests
class third_update:
def down(self):
# 新建一个文件对象
temp_file = os.path.join(self.download_path,'update.zip')
# 指定更新包下载的路径
# logger.info("下载临时文件路径为:{}".format(temp_file))
with open(temp_file,'wb') as self.fileobj:
# 请求更新文件包
f = requests.get(self.download_url, stream=True)
# 写入文件
offset = 0
for chunk in f.iter_content(chunk_size=self.buffer):
if not chunk:
break
self.fileobj.seek(offset)
self.fileobj.write(chunk)
offset = offset + len(chunk)
proess = offset / int(self.filesize) * 100
# logger.info("写入块:{},{}".format(offset,proess))
self.download_proess_signal.emit(int(proess))
def work(self):
# 1.杀死主程序进程
for proc in psutil.process_iter():
if proc.name() == 'xxx.exe':
proc.kill()
# 2.获取程序本地路径
current_path = os.path.dirname(os.path.abspath(__file__))
# logger.info("当前程序路径:{}".format(current_path))
# 3.解压新版本压缩包到程序本地路径
update_file_path = os.path.join(self.download_temp_path, 'update.zip')
shutil.unpack_archive(filename=update_file_path, extract_dir=current_path)
# 4.删除临时文件夹和文件
os.remove(update_file_path)
shutil.rmtree(self.download_temp_path)
if __name__ == '__main__':
tp = third_update()
tp.down()
tp.work()