python自动更新程序
简介
windows 自动更新程序
最近用python给开发了一个windows监控软件,用于监控电脑的运行情况,更新电脑软件。由于有几十电脑,一台一台手动更新就不太靠谱了,于是就开发了一个自动更新软件的的程序。
1.基本思路
基本步骤如下
1.获取远程配置文件
2.对比本地配置文件
3.获取更新文件
4.进行更新
2.代码实现
使用到的库
os 用于执行和停止程序
urllib.request 用于获取运程文件
base64 用于解析数据
datetime 用于格式化时间
time 用于休眠程序
json 用于解析json
2.1核心代码如下
def run():# 循环获取while True:try:# 1.加载远程配置online_json = json.loads(get_data_by_url("http://xxx/HboUpdateVersion.json"))# 1.1加载本地配置local_json = read_version_json()# 2.比较远程配置和本地配置for program_name in online_json:if local_json.get(program_name):# 2.1版本号有更新if online_json.get(program_name).get("version") > local_json.get(program_name).get("version"):# 3.获取文件 4.更新exe文件create_exe_file(online_json.get(program_name).get("url"), program_name)# 5.判断是否需要启动运行if online_json.get(program_name).get("is_run"):run_exe(program_name)else:create_exe_file(online_json.get(program_name).get("url"), program_name)if online_json.get(program_name).get("is_run"):run_exe(program_name)# 更新versionwrite_version_json(data=online_json)except Exception:write_log("更新失败")# sleep 1 hourtime.sleep(3600)if __name__ == '__main__':run()
2.2配置文件格式
配置文件放在文件服务上,程序读取后和本地配置进行比较更新。
这里可以使用配置中心,或者自己实现个配置服务接口代替
{"HboMonitor": -- 应用名称{"version": 1, -- 版本号"url": "http://xxx/HboMonitor", -- 远程待更新文件地址"is_run":true -- 是否需要立即运行},"HboHello":{"version": 2,"url": "http://xx/HboHello","is_run":false}
}
3.完整代码
# -*- coding: utf-8 -*-
# @file : HboUpdate.py
# @author : songxulin
# @date : 2021:08:20 14:00:00
# @version: 1.0
# @desc : 自动更新exe
import os
import urllib.request
import base64
import datetime
import time
import json# 公共目录
directory = "C:/xxx"def create_exe_file(url, file_name):"""创建文件"""try:if not os.path.exists(directory):os.mkdir(directory)# 更新替换文件前需停止待更新程序os.system('taskkill /f /t /im %s.exe' % file_name)if not url:return "url is null"b64_text = get_data_by_url(url)exe_file_path = "%s/%s.exe" % (directory, file_name)f = open(exe_file_path, 'wb+')f.write(base64.b64decode(b64_text))f.close()except IOError:return "cannot open url"except Exception as e:return "fail"return "success"def run_exe(file_name):"""启动程序"""os.system('start "" "%s/%s.exe"' % (directory, file_name))def get_data_by_url(url):"""获取远程数据"""header = {'User-Agent': 'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} # 头部信息request = urllib.request.Request(url=url, headers=header) # 请求处理b64_text = urllib.request.urlopen(request).read() # 读取结果return b64_textdef read_version_json():"""读取本地版本文件"""if not os.path.exists("%s/version.json" % directory):return {}with open("%s/version.json" % directory, mode='r', encoding='utf-8') as j:return json.load(j)def write_version_json(data):"""更新写入版本文件"""with open('%s/version.json' % directory, 'w') as f:json.dump(data, f)def write_log(text):"""记录日志"""f = open('%s/HboUpdate.log' % directory, mode='a', encoding='utf-8')f.write(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S' + "\t" + text + "\n"))f.close()def run():while True:try:online_json = json.loads(get_data_by_url("http://xxx/HboUpdateVersion.json"))local_json = read_version_json()if online_json == local_json:# sleep 1 hourtime.sleep(3600)continuefor program_name in online_json:if local_json.get(program_name):if online_json.get(program_name).get("version") > local_json.get(program_name).get("version"):write_log("更新:%s 版本:%s->%s" % (program_name, local_json.get(program_name).get("version"),online_json.get(program_name).get("version")))write_log("更新地址:%s" % online_json.get(program_name).get("url"))write_log("更新结果:%s" % create_exe_file(online_json.get(program_name).get("url"), program_name))if online_json.get(program_name).get("is_run"):run_exe(program_name)else:write_log("更新:%s 版本: %s" % (program_name, online_json.get(program_name).get("version")))write_log("更新地址:%s" % online_json.get(program_name).get("url"))write_log("更新结果:%s" % create_exe_file(online_json.get(program_name).get("url"), program_name))if online_json.get(program_name).get("is_run"):run_exe(program_name)# 更新versionwrite_version_json(data=online_json)except Exception:write_log("更新失败")# sleep 1 hourtime.sleep(3600)if __name__ == '__main__':run()
程序可以使用pyinstaller打包成 exe直接在windows下运行,将程序设置为自启动。
源码
python自动更新程序相关推荐
- C#软件自动更新程序
2019独角兽企业重金招聘Python工程师标准>>> 基于C#实现的软件自动更新程序,之前在网上搜集了两款软件自动更新程序,在实际应用中,对部分BUG进行修复,添加+完善一些功能. ...
- python自动更新excel_Python办公自动化|自动更新表格,告别繁琐
大家好,又到了Python办公自动化专题.今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sh ...
- python自动更新excel_Python杀死了Excel|自动更新表格,告别繁琐
大家好,又到了Python办公自动化专题. 今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张s ...
- python自动更新excel_Python办公自动化(六)|自动更新表格,告别繁琐
今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sheet 汇总表的更新,大概就是这样 当然实 ...
- C# WINFORM的自动更新程序
自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...
- 如何制作自动更新程序?
原文出自:http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自动更新程序? [版权所有 邱秋 2014 metaphysis@y ...
- python自动更新pom文件
前言 项目越来越多,版本管理越来越麻烦,在项目上我使用 maven version 来进行版本管理.主要还是在分布式项目中模块众多的场景中使用,毕竟各个模块对外的版本需要保持统一. 关于这个插件如何使 ...
- python写桌宠_【Unity/开源】八重樱桌宠(三):Python自动更新、修复描边
接下来就到了喜闻乐见的PY环节: defget_html(url):try:headers = { "Host": "github.com","Use ...
- 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...
上篇文章主要介绍了webservice的部署以及主要的代码,下面给大家贴上主程序的代码,并简单的讲解.主程序判断是否有更新时通过主程序目录下有一个update.ini文件内的version是否有变化, ...
最新文章
- android:layout_gravity和android:gravity属性的区别
- ym——Android之ListView性能优化
- office2007右键doc,xls
- Network 第九篇 - 双机热备-HSRP
- leetcode之Contains Duplicate
- matlab中怎么找晶闸管,matlab中晶闸管如何连接
- 数据结构_郝斌老师自学大纲
- html打印表格样式,HTML打印表格
- Redis--huan
- java xml解析框架_JAVA解析xml的五种方式对比
- idea TODO注释功能的使用
- 简单的微信使用技巧,你需要掌握的技巧
- 如何画一条0.5px的边(细线)
- 我国有关信息方面的法律法规
- 同一网段两个主机通信(交换机) 不同网段两个主机通信(路由器)
- 基于Java的服务器应用监控系统设计与实现
- 004.python科学计算库pandas(中)
- 未明学院:追剧一个月,我才发现《长安十二时辰》是一部大数据破案指南
- 在VMware8.0下安装crux2.6
- 毫秒转化成几天几个小时几分几秒