自我更新的py2exe/py2app应用程序
我在维护一个跨平台的应用程序,这个程序是用PyQt开发的,可以在Linux、Mac和Windows上运行。
Windows和Mac版本是通过py2exe和py2app来打包的,这样打包出来的文件比较大,大约有40MB。
我想添加一个“自动更新”的功能,目的是通过补丁来减少下载的文件大小:
- 在一个HTTP服务器上检查是否有新版本
- 下载更新到最新版本所需的补丁
- 应用这些补丁并重启应用程序
我有一些问题:
- 在Windows上更新应用程序的最佳方法是什么?因为打开的文件是锁定的,不能被覆盖。
- 我该如何准备和应用这些补丁?也许可以使用bsdiff/pspatch?
[更新]
我创建了一个简单的类来使用bsdiff制作补丁,效果非常好,正如他们网站上所宣传的那样:对我应用的两个py2exe版本(解压后约75MB)进行比较,生成了一个44kB的补丁!这个大小对我来说很合适,我会继续使用这种格式。
相关代码可以在pyflu的“更新”包中找到,这是一个小型的Python代码库。
5 个回答
这条信息已经有4年了,但你们听说过Esky吗?
我对补丁不太了解,但在OS X上,Cocoa应用程序的“标准”做法是使用Sparkle。简单来说,它就是做“应用广播”。每次都会下载整个应用程序。你可以看看这个,或许能给你一些灵感。
我想在OS X上,你可能只需要下载包含你特定代码的应用程序包的那部分(而不是打包的库等),这样会比较小,也容易在包里替换。
在Windows上,你可能也能用类似的方法,不把你的应用打包成一个exe文件,这样就可以只更改那个实际发生变化的文件。
我想你的Python代码应该远远小于40MB,所以这样做可能是个好主意。
至于如何替换正在运行的应用,首先你需要找到它的位置,可以用sys.executable
来找到起始点,然后你可以创建一个子进程,结束父进程,让子进程来进行实际的替换?
我现在正在玩一个小的wxPython应用,正好在考虑这个问题。很想听听你有什么想法。
另外,你的应用压缩后有多大?如果压缩效果不错,也许你还是可以考虑发送整个应用。
我觉得py2exe不支持补丁更新。不过,如果你不把整个程序打包成一个单独的EXE文件(可以参考py2exe网站的例子 - 页面底部),你可以通过只替换某些文件来进行小规模更新,比如替换EXE文件。这可以大大减小你更新的文件大小。
你可以写一个单独的更新程序,这个程序可以在你的应用程序内部下载和运行。每次更新时,这个程序可能会有所不同,因为需要更新的文件可能会变化。
当应用程序启动更新程序时,它需要先关闭自己,这样文件才能被替换。更新完成后,你可以让更新程序在关闭之前重新打开应用程序。