【问题标题】:Self updating py2exe/py2app application自更新 py2exe/py2app 应用程序
【发布时间】:2009-04-17 13:22:58
【问题描述】:

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

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

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

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

我有一些问题:

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

[更新]

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

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

【问题讨论】:

  • 出于兴趣,您打算如何处理跨越多个版本/更新的更新。例如一个用户有 1.0,那么当他们下次尝试运行它时,已经有(比如说)10 个更新?你会按需生成补丁吗?使用缓存我想它不会太糟糕,但假设你有一些可用的服务器端代码......
  • 如果用户错过了 10 个更新,更新程序将下载更新到最新版本所需的 10 个补丁并一一应用。没有服务器端代码,只是一个显示目录内容的简单 apache 服务器。

标签: python deployment patch py2exe


【解决方案1】:

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

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

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

【讨论】:

  • 出于好奇,为什么 python 可执行文件或任何其他可执行文件不支持二进制补丁?二进制补丁不只是 NewVersion.exe 减去 OldVersion.exe,补丁更改了使其成为 NewVersion.exe 所需的字节吗?
【解决方案2】:

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

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

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

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

至于替换正在运行的应用程序,首先你需要找到它的位置,所以你可以使用sys.executable 为你找到一个起点,然后你可能会 fork 一个子进程,杀死父进程并拥有孩子在做实际的替换?

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

还有你的应用压缩后有多大?如果它压缩得很好,那么也许你仍然可以负担得起发送整个东西。

【讨论】:

  • 应用程序是 40 MB 压缩 :) 大部分是 DLL 和 python 运行时,我的代码只有 500 KB。
【解决方案3】:

这已经 4 岁了,但是 Esky 呢?

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 有时您还想更新 DLL(例如,在更改 Qt 版本、添加新的扩展模块依赖项等时),我不想在每次制作时手动检查一切是否正常发布。
    【解决方案5】:

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

    它支持亚马逊和scp。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2013-09-01
      • 2018-10-09
      • 2018-02-14
      • 2010-12-12
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多