自我更新py2exe / py2app应用程序

时间:2009-04-17 13:22:59

标签: python deployment patch py2exe

我维护一个跨平台应用程序,基于在Linux mac和windows上运行的PyQt。

使用py2exe和py2app分发windows和mac版本,这会生成相当大的包(~40 MB)。

我想添加一个“自动更新”功能,基于修补程序来限制下载大小:

  • 检查http服务器上的新版本
  • 下载更新到最新版本所需的补丁
  • 应用修补程序列表并重新启动应用程序

我有一些问题:

  • 更新Windows应用程序的首选方法是什么,因为打开的文件被锁定且无法覆盖?
  • 如何准备和应用补丁?也许使用bsdiff/pspatch

[更新]

我创建了一个简单的类,用bsdiff制作补丁,这非常有效,就像他们网站上宣传的那样:我的应用程序的两个py2exe版本上的差异(~75 MB未压缩)产生44 kB补丁!对我来说足够小,我会坚持这种格式。

代码可以在pyflu的'update'包中找到,这是一个很小的Python代码库。

5 个答案:

答案 0 :(得分:4)

我不相信py2exe支持修补更新。但是,如果您没有将整个软件包捆绑到单个EXE(py2exe website example - 页面底部),只需替换某些文件就可以获得较小的更新,例如EXE文件, 例如。这可以显着减少更新的大小。

您可以编写单独的更新程序,可以从应用程序内部下载/运行。此应用程序可能因每次更新而有所不同,因为需要更新的文件可能会更改。

一旦应用程序启动更新程序,它将需要关闭自身,以便可以覆盖文件。更新程序完成后,您可以在关闭之前重新打开应用程序。

答案 1 :(得分:3)

我不知道补丁,但在OS X上,cocoa应用程序的“标准”是Sparkle。基本上它是“appcasting”。它每次下载完整的应用程序。可能值得一看灵感。

我想在OS X上你可能只需要下载包含你的特定代码的应用程序包的实际部分(而不是打包的libs等),并且它在包中相当小且易于替换。

在Windows上,您可能可以通过不将您的应用程序捆绑到一个exe中来做类似的技巧 - 从而让您更改实际更改的一个文件。

我想你的实际Python代码将远远低于40Mb,所以这可能是要走的路。

至于替换正在运行的应用程序,首先你需要找到它的位置,这样你就可以使用sys.executable来获得一个起点,然后你可以将子进程分叉,杀死父进程和让孩子做实际的替换?

我目前正在玩一个小型的wxPython应用程序并且想知道这个问题。我很想知道你的想法。

压缩时你的应用程序有多大?如果它压缩得很好,那么也许你仍然可以负担得起整个事情。

答案 2 :(得分:2)

现在已经4岁了,但是Esky呢?

答案 3 :(得分:1)

由于py2exe将您应用的所有已编译模块放入ZIP文件中,因此您可以尝试通过创建从给定文件集更新它的脚本来更新此文件。 然后替换已更改的其余文件(如果有的话,应该很少)。

答案 4 :(得分:0)

一篇旧帖子,但我想我会用pyinstaller提及pyupdater。

它支持亚马逊和scp。

未来,根据最近的github帖子,他们计划支持免费替代方案。