13

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

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

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

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

我有一些疑问:

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

[更新]

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

该代码可在pyflu的“更新”包中找到,这是一个小型 Python 代码库。

4

5 回答 5

4

我不相信 py2exe 支持补丁更新。但是,如果您不将整个包捆绑到单个 EXE 中(py2exe 网站示例- 页面底部),您可以通过替换某些文件(例如 EXE 文件)来避免较小的更新。这可以显着减少更新的大小。

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

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

于 2009-04-17T13:48:34.447 回答
3

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

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

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

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

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

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

压缩时你的应用程序有多大?如果它压缩得很好,那么也许你仍然有能力发送整个东西。

于 2009-04-17T13:47:47.710 回答
2

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

于 2013-07-09T05:02:48.827 回答
1

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

于 2009-04-17T15:06:33.260 回答
0

一个旧帖子,但我想我会提到 pyupdater 和 pyinstaller。

它支持亚马逊和scp。

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

于 2017-12-14T14:59:23.737 回答