简介

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自动更新程序相关推荐

  1. C#软件自动更新程序

    2019独角兽企业重金招聘Python工程师标准>>> 基于C#实现的软件自动更新程序,之前在网上搜集了两款软件自动更新程序,在实际应用中,对部分BUG进行修复,添加+完善一些功能. ...

  2. python自动更新excel_Python办公自动化|自动更新表格,告别繁琐

    大家好,又到了Python办公自动化专题.今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sh ...

  3. python自动更新excel_Python杀死了Excel|自动更新表格,告别繁琐

    大家好,又到了Python办公自动化专题. 今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张s ...

  4. python自动更新excel_Python办公自动化(六)|自动更新表格,告别繁琐

    今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sheet 汇总表的更新,大概就是这样 当然实 ...

  5. C# WINFORM的自动更新程序

    自动更新程序AutoUpdate.exe https://git.oschina.net/victor596jm/AutoUpdate.git 1.获取源码 http://git.oschina.ne ...

  6. 如何制作自动更新程序?

    原文出自:http://blog.csdn.net/metaphysis/article/details/18866631 如何制作自动更新程序? [版权所有 邱秋 2014 metaphysis@y ...

  7. python自动更新pom文件

    前言 项目越来越多,版本管理越来越麻烦,在项目上我使用 maven version 来进行版本管理.主要还是在分布式项目中模块众多的场景中使用,毕竟各个模块对外的版本需要保持统一. 关于这个插件如何使 ...

  8. python写桌宠_【Unity/开源】八重樱桌宠(三):Python自动更新、修复描边

    接下来就到了喜闻乐见的PY环节: defget_html(url):try:headers = { "Host": "github.com","Use ...

  9. 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...

    上篇文章主要介绍了webservice的部署以及主要的代码,下面给大家贴上主程序的代码,并简单的讲解.主程序判断是否有更新时通过主程序目录下有一个update.ini文件内的version是否有变化, ...

最新文章

  1. android:layout_gravity和android:gravity属性的区别
  2. ym——Android之ListView性能优化
  3. office2007右键doc,xls
  4. Network 第九篇 - 双机热备-HSRP
  5. leetcode之Contains Duplicate
  6. matlab中怎么找晶闸管,matlab中晶闸管如何连接
  7. 数据结构_郝斌老师自学大纲
  8. html打印表格样式,HTML打印表格
  9. Redis--huan
  10. java xml解析框架_JAVA解析xml的五种方式对比
  11. idea TODO注释功能的使用
  12. 简单的微信使用技巧,你需要掌握的技巧
  13. 如何画一条0.5px的边(细线)
  14. 我国有关信息方面的法律法规
  15. 同一网段两个主机通信(交换机) 不同网段两个主机通信(路由器)
  16. 基于Java的服务器应用监控系统设计与实现
  17. 004.python科学计算库pandas(中)
  18. 未明学院:追剧一个月,我才发现《长安十二时辰》是一部大数据破案指南
  19. 在VMware8.0下安装crux2.6
  20. 毫秒转化成几天几个小时几分几秒

热门文章

  1. 俞敏洪:我让女儿主动学习的秘密
  2. 用RealMedia Editor截取和合并RMVB视屏
  3. iOS APP 发布上架流程
  4. eclipse paho java_MQTT研究之EMQ:【eclipse的paho之java客户端使用注意事项】
  5. Doctype 的作用
  6. UnityTCP发送接收图片
  7. 回顾人工智能大爆炸的引爆点(The origin of the AI big bang)
  8. 从0开始搭建preact开发环境
  9. 李宏毅机器学习(23)
  10. opencv——waitKey函数