基于esky实现python应用的自动升级
一、esky介绍
Esky is an auto-update framework for frozen Python applications. It provides a simple API through which apps can find, fetch and install updates, and a bootstrapping mechanism that keeps the app safe in the face of failed or partial updates. Updates can also be sent as differential patches.
Esky is currently capable of freezing apps with py2exe, py2app, cxfreeze and bbfreeze. Adding support for other freezer programs should be easy; patches will be gratefully accepted.
We are tested and running on Python 2.7 Py2app will work on python3 fine, the other freezers not so much.
Esky是一个python编译程序的自动升级框架,提供简单的api实现应用的自动更新(包括比较版本、更新版本),esky支持py2exe,py2app,cxfreeze以及bbfreeze等多种python打包框架。
二、esky安装及说明
1、pip安装
pip install esky
2、esky说明
https://github.com/cloudmatrix/esky/
3、esky教学视频
http://pyvideo.org/pycon-au-2010/pyconau-2010--esky--keep-your-frozen-apps-fresh.html
三、esky用法示例
esky用起来比较简单,我们这里以常用的基于wx的windows应用举例。
wxpython下有个wx.lib.softwareupdate 类,对wxpython应用的esky升级进行了二次封装。
网上有个现成的示范例子,具体网址:http://www.blog.pythonlibrary.org/2013/07/12/wxpython-updating-your-application-with-esky/
代码很简单,对其中的关键部分进行注释说明(红色字体部分):
# ----------------------------------------
# image_viewer2.py
#
# Created 03-20-2010
#
# Author: Mike Driscoll
# ---------------------------------------- import glob
import os
import wx
from wx.lib.pubsub import setuparg1
from wx.lib.pubsub import pub as Publisher
#申明语句
from wx.lib.softwareupdate import SoftwareUpdate
import version ########################################################################
class ViewerPanel(wx.Panel):
"""""" #----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
... ########################################################################
class ViewerFrame(wx.Frame):
"""""" #----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
title = 'Image Viewer %s' %(version.VERSION) wx.Frame.__init__(self, None, title=title)
panel = ViewerPanel(self)
……
########################################################################
#注意基类是两个
class ImageApp(wx.App, SoftwareUpdate):
"""""" #----------------------------------------------------------------------
def OnInit(self):
"""Constructor"""
BASEURL = "http://127.0.0.1:8000"
#升级初始化,参数1:检查升级包的网页地址,参数2:升级说明文件,升级网页地址与升级说明文件可以不在一个目录。
self.InitUpdates(BASEURL,BASEURL + 'ChangeLog.txt')
#启动升级检查,参数:是否显示升级提示,默认显示提示。显然该语句可以放到按钮或者菜单中触发。
self.CheckForUpdate(silentUnlessUpdate=False)
frame = ViewerFrame()
self.SetTopWindow(frame)
self.SetAppDisplayName('Image Viewer')
#ViewerPanel..SetValue('Image Viewer %s' %(version.VERSION)) return True #----------------------------------------------------------------------
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = ViewerFrame()
app.MainLoop()
总结:
1、先声明类
from wx.lib.softwareupdate import SoftwareUpdate
2、在app中调用声明的类,做为基类之一
class UpApp(wx.App, SoftwareUpdate):
3、在app的中初始化softwareupate,一般放在OnInit()中
wx.GetApp().InitUpdates('http://127.0.0.1/update.html', 'http://127.0.0.1/ChangeLog.txt')
4、在窗口事件中调用升级检查,可以放到菜单或者按钮中
wx.GetApp().CheckForUpdate()
四、esky编译脚本编写
esky本身不支持编译,所以必须调用cx_freeze或者py2exe之类进行python编译,由于本人比较熟悉cx_freeze,所以……以下例子均是基于cx_freeze。
其编译脚本跟cx_freeze的setup.py有点类似,先来一个简单例子:
#coding=utf-8
#---------------------------------------------------------------------------
# This setup file serves as a model for how to structure your
# distutils setup files for making self-updating applications using
# Esky. When you run this script use
#
# python setup.py bdist_esky
#
# Esky will then use py2app or py2exe as appropriate to create the
# bundled application and also its own shell that will help manage
# doing the updates. See wx.lib.softwareupdate for the class you can
# use to add self-updates to your applications, and you can see how
# that code is used here in the superdoodle.py module.
#--------------------------------------------------------------------------- from esky import bdist_esky
from setuptools import setup # Common settings
exeICON = 'mondrian.ico'
NAME = "wxImageViewer"
#明确调用cx_freeze进行编译
FREEZER ='cx_freeze'
#cx_freeze的编译options
FREEZER_OPTIONS = {
"excludes": ["tkinter","collections.sys",'collections._weakref']#, #剔除wx里tkinter包
}; APP = [bdist_esky.Executable("image_viewer.py",
gui_only=True,
icon=exeICON,
)] DATA_FILES = [ 'mondrian.ico' ] ESKY_OPTIONS = dict( freezer_module = FREEZER,
freezer_options = FREEZER_OPTIONS,
enable_appdata_dir = True,
bundle_msvcrt = False,
) # Build the app and the esky bundle
setup( name = NAME,
version = '1.0',
scripts = APP,
data_files = DATA_FILES,
options = dict(bdist_esky=ESKY_OPTIONS),
)
这个是编译脚本,具体的编译命令,如下。
五、编译命令
注意setup.py中的version=1.0就是版本定义,若是要发布升级版,只要把version修改成1.1或者2.0,程序就会判断为升级包,进行更新。
编译分两种方式,一种是编译完整包,一种是编译增量补丁包。
特别说明一下补丁包的生成机制:先编译完整包,再比较老版本完整包、新版本完整包,生成差异补丁包。
1、编译完整包
python setup.py bdist_esky
编译之后会在dist目录生成名为wxImageViewer-1.0.win-amd64.zip的打包文件,注意这个文件名本身就包含了版本信息:
1)、wxImageViewer是应用名,对应setup.py中的name定义
2)、1.0是版本号,对应setup.py中version定义
3)、amd64代表64位编译版本,跟python的版本一致。
2、编译增量补丁包
python setup.py bdist_esky_path
注意每次重新编译,需要修改version,会自动生成会自动增量包。
譬如第二次编译,修改version=2.0,则增量包为:wxImageViewer-1.0.win-amd64.from-2.0.patch
1)增量包文件基本很小
2)升级时会自动判断是下载全新包,还是下载增量包。
譬如本地程序是1.0版本,服务器端发了2.0版本的升级文件:wxImageViewer-2.0.win-amd64.zip、wxImageViewer-1.0.win-amd64.from-2.0.patch,esky会自动只下载patch文件。
六、复杂的esky编译脚本
1、实现目录打包
2、实现应用程序版本信息设置
#coding=utf-8
#---------------------------------------------------------------------------
'''
Create by: joshua zou 2016.10.08
Purpose: 调用esky打包成执行文件,支持自动升级。
Example: python setup.py bdist_esky / python setup.py bdist_esky_patch
'''
#--------------------------------------------------------------------------- from esky import bdist_esky
from setuptools import setupimport distutils # Dependencies are automatically detected, but it might need fine tuning. VER = '1.16.1102.1'# Common settings
exeICON = 'et.ico'
NAME = "eTaxMain.exe"
FREEZER ='cx_freeze' ESKY_VERSION ={ "version": VER,
"company": u"****公司",
"description": u"****程序",
"product": u"****系统",
'copyright':u"***@版权所有 2016-2020"
} #版本申明部分
metadata= distutils.dist.DistributionMetadata()
metadata.version = ESKY_VERSION['version']
metadata.description = ESKY_VERSION['description']
metadata.copyright = ESKY_VERSION['copyright']
metadata.name = ESKY_VERSION['product']
#版本申明结束 FREEZER_OPTIONS = {
"packages": ["os","wx","requests","lxml","lxml.etree"], #包含package
"includes": ["PIL","traceback",'HTMLParser'], #这里可以包含一些自定义包。
"excludes": ['MSVCP90.dll',
'mswsock.dll',
'powrprof.dll',
'USP10.dll',
'_gtkagg', '_tkagg',
'bsddb', 'curses',
'pywin.debugger','pywin.debugger.dbgcon',
'pywin.dialogs','tcl',
'Tkconstants', 'Tkinter',
'wx.tools.*','wx.py.*',
"collections.sys",'collections._weakref'], #剔除wx里tkinter包
"metadata":metadata
}; APP = [bdist_esky.Executable("eT.py",
gui_only=True,
icon=exeICON,
)]
#打包et.ico,helpinfo.txt放到应用目录下
#打包.\lang\zh_CN\LC_MESSAGES\eT.mo到lang\zh_CN下。
DATA_FILES=[('', ['et.ico','helpinfo.txt']),
('lang\zh_CN', ['.\lang\zh_CN\LC_MESSAGES\eT.mo','.\lang\zh_CN\LC_MESSAGES\eT.po'])
] ESKY_OPTIONS = dict( freezer_module = FREEZER,
freezer_options = FREEZER_OPTIONS,
enable_appdata_dir = True,
bundle_msvcrt = False,
) # Build the app and the esky bundle
setup( name = NAME,
version = VER,
scripts = APP,
data_files = DATA_FILES,
options = dict(bdist_esky=ESKY_OPTIONS),
)
前前后后,为了这个esky,折腾了快2个礼拜,总算圆满成功,写的比较简单,感兴趣的留言交流。
基于esky实现python应用的自动升级的更多相关文章
- Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)
前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...
- c# 基于FTP协议的简易软件自动升级程序
最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...
- 【转】【Mac系统】之Python版本切换、谷歌浏览器取消自动升级
都是很有用的文章,本文都是转载文章,以便后续查阅: Mac Chrome浏览器取消自动升级(看这一篇就够了) <Mac修改默认python版本> <mac设置python版本切换,和 ...
- python使用selenium驱动chromium防止浏览器自动升级失效!
python爬虫或者自动化项目中有时会用到selenium自动化测试框架,驱动chrom时由于谷歌浏览器自动升级,会造成驱动和浏览器版本不匹配问题,这时可以用到Chromium,这是谷歌推出用于开发目 ...
- 基于Appium、Python的自动化测试
基于Appium.Python的自动化测试环境部署和实践 第一章 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile ...
- Ionic实战 自动升级APP(Android版)
Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户 ...
- NetworkComms 文件上传下载和客户端自动升级(非开源)
演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...
- SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework
9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...
- ionic 实现自动升级APP
最近做移动商城开发,需要一个自动升级APP的功能,在网上搜罗很多,发现有的是下载APK,有的在我这服务无法实现,由于时间原因,都被PASS了,最后找到了一个热更新插件,经过半天的调试,可以使用,很欣喜 ...
随机推荐
- WebLogic 12c Linux 命令行 安装
最近负责在Linux上安装WebLogic Server 12c,客户说要安装最新的版本,版本号为 12.1.X(12.1.2,12.1.3).开始以为和旧版安装一样,使用控制台的方式,下载bin文件 ...
- java web 机试
经过近一个月的学习,我们的java web已经学习完了. 这是我们这次的机试题. 一:题目 请利用MVC设计模式,并使用JSP.Servlet.JSTL和JQuery等技术实现动态条件的分页显示查询. ...
- 第一章 Java Web工作原理
一:在本章我们将学到如下的内容 >HTTP协议原理 >服务器端Web编程原理 >Servlet与Web容器 >Java Web应用程序的组成 >Tomcat介绍 一:1. ...
- webpack4 自学笔记四(style-loader)
全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/css 引入- ...
- PowerBuilder编程新思维5:包装(界面美化与WebUI+React)
PowerBuilder编程新思维5:包装(界面美化与WebUI+React) 前一节,分析了三种界面美化方案,都是控件级的美化.今天再来分析一下窗口级的美化.上一次讲的DirectUI,大家反响一般 ...
- FFmpeg简易播放器的实现-音频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- ADO.NET 【增】【删】【改】【查】
数据访问 Using System.Data.SqlClient; 对应命名空间 -- SqlConnection ...
- PhpStorm快捷方式
转载源:http://www.cr173.com/html/66775_1.html PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具,PhpStorm可随时帮助用 ...
- Java - ArrayList源码分析
java提高篇(二一)-----ArrayList 一.ArrayList概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 nul ...
- Codeforces729D(SummerTrainingDay01-F)
D. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...