一、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应用的自动升级的更多相关文章

  1. Py福利,基于uiautomatorviewer 的Python 自动化代码自动生成工具分享(jar已发布GitHub,欢迎Star)

    前言做UI自动化无论你用SDK自带的uiautomatorviewer还是Macaca还是Appium自动的inspector,代码最多的就是那些繁琐重复的找元素后点击,输入,长按.....等.现在偷 ...

  2. c# 基于FTP协议的简易软件自动升级程序

    最近在重写了一个老的产品条码扫描程序,客户端数越有30个,因为经常有更新,C/S维护非常不方便,所以做一个自动更新程序特别有必要. 在网上随便找了找自动更新的方案,大多使用VS的发布/更新功能,不太喜 ...

  3. 【转】【Mac系统】之Python版本切换、谷歌浏览器取消自动升级

    都是很有用的文章,本文都是转载文章,以便后续查阅: Mac Chrome浏览器取消自动升级(看这一篇就够了) <Mac修改默认python版本> <mac设置python版本切换,和 ...

  4. python使用selenium驱动chromium防止浏览器自动升级失效!

    python爬虫或者自动化项目中有时会用到selenium自动化测试框架,驱动chrom时由于谷歌浏览器自动升级,会造成驱动和浏览器版本不匹配问题,这时可以用到Chromium,这是谷歌推出用于开发目 ...

  5. 基于Appium、Python的自动化测试

    基于Appium.Python的自动化测试环境部署和实践   第一章 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile ...

  6. Ionic实战 自动升级APP(Android版)

    Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户 ...

  7. NetworkComms 文件上传下载和客户端自动升级(非开源)

    演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...

  8. SNF开发平台WinForm之八-自动升级程序部署使用说明-SNF快速开发平台3.3-Spring.Net.Framework

    9.1运行效果: 9.2开发实现: 1.首先配置服务器端,把“SNFAutoUpdate2.0\服务器端部署“目录按网站程序进行发布到IIS服务器上. 2.粘贴语句,生成程序 需要调用的应用程序的Lo ...

  9. ionic 实现自动升级APP

    最近做移动商城开发,需要一个自动升级APP的功能,在网上搜罗很多,发现有的是下载APK,有的在我这服务无法实现,由于时间原因,都被PASS了,最后找到了一个热更新插件,经过半天的调试,可以使用,很欣喜 ...

随机推荐

  1. 揭开Future的神秘面纱——任务执行

    前言 此文承接之前的博文 解开Future的神秘面纱之取消任务 补充一些任务执行的一些细节,并从全局介绍程序的运行情况. 系列目录 揭开Future的神秘面纱——任务取消 揭开Future的神秘面纱— ...

  2. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  3. 第五章 Web应用程序状态管理

      状态管理概述 Cookie Session URL重写   状态管理概述: HTTP协议使用的是无状态的连接 对容器而言,每一个请求都来自于一个新的客户 这里我们有四种方法来解决这个状态: a:表 ...

  4. 利用https实现站点的访问

    简介 它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果.HTTPS实际上应用了Netscape的安 全套接字层(SSL)作为HTTP应用层的子层.( ...

  5. DispatcherServlet源码注解分析

    DispatcherServlet的介绍与工作流程 DispatcherServlet是SpringMVC的前端分发控制器,用于处理客户端请求,然后交给对应的handler进行处理,返回对应的模型和视 ...

  6. 深入出不来nodejs源码-V8引擎初探

    原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...

  7. 深入理解java虚拟机---3垃圾回收机制GC

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  8. 方格填数-2015决赛C语言A组第一题

    在2行5列的格子中填入1到10的数字. 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的. 如[图1.png]所示的2种,就是合格的填法.请你计算一共有多少种可能的方案.请提交该整数,不要 ...

  9. The area (hdu1071)积分求面积

    The area Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. Java - “JUC”锁

    [Java并发编程实战]-----“J.U.C”:锁,lock   在java中有两种方法实现锁机制,一种是在前一篇博客中([java7并发编程实战]-----线程同步机制:synchronized) ...