基于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了,最后找到了一个热更新插件,经过半天的调试,可以使用,很欣喜 ...
随机推荐
- postgresql逻辑结构--索引(六)
一.索引简介 二.索引分类 三.创建索引 四.修改索引 五.删除索引
- ABP框架源码中的Linq扩展方法
文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...
- rsync实现文件同步
rsync是类unix系统下的数据镜像备份工工具,一般linux系统都自带了 [可以确认一下:shell>rpm -qa|grep rsync] 服务端:192.168.1.2 同步目录:/h ...
- OSI与TCP/IP模型
1 OSI参考模型 谈到网络不能不谈OSI参考模型,虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考.在现实网络世界里,T ...
- k-近邻算法(KNN)
最近邻算法可以说是最简单的分类算法,其思想是将被预测的项归类为和它最相近的项相同的类.我们通过简单的计算比较即将被预测的项与已有训练集中各项的距离(差距),选择其中差距最小的一项,该项的类别即为我们即 ...
- 跨站点请求伪造(CSRF)
一.前言 跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动 ...
- 初入Java后端之Servlet
初入Java后端之Servlet 后端 Servlet 什么是Servlet? Servlet实际上是一个按照Servlet规范写的Java类.是运行在Web服务端的Java应用程序.与Java程序 ...
- es6学习笔记11--Proxy和Reflect
Proxy概述 Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy可以理解成,在目标对象之前 ...
- C#Redis 事务操作
一.理论 还是抄前辈的理论知识. 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基 ...
- 乐字节-Java8新特性-接口默认方法之Stream流(下)
接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...