【问题标题】:How to remotely update Python applications如何远程更新 Python 应用程序
【发布时间】:2011-10-19 10:19:52
【问题描述】:

将更改推送到用 Python 编写的程序的最佳方法是什么?我有一个用 Python 编写的软件,它会定期更新。最好的方法是什么?所有机器都将安装 Windows 7。

另外,请原谅我的问题含糊不清。这将是我第一次必须实施更新程序。随意提及您希望我添加的细节。

【问题讨论】:

  • 您目前是否正在打包您的应用程序以进行安装/分发?它只是一个脚本文件吗?应用程序代码是否需要更新,或者您只是在谈论从网络获取数据更新?

标签: python packaging remote-access download software-update


【解决方案1】:

我建议使用源代码控制程序,例如 git 或 subversion。此外,如果您对每个人都看到代码感到满意,您可以将代码发布在 github 上,任何人都可以从中提取代码。您可以将其设为私有,但您必须为此付费,并且所有用户也将创建一个 github 帐户并使用他们的 git install 进行设置。

如果您使用源代码控制程序,其他人将不得不通过运行命令手动拉取编辑,但您可以制作一个脚本 pr 批处理文件来执行此操作并让它在启动时或定期运行。

需要明确的是,如果你想这样做,你必须将代码放在支持 SSH 的服务器上并设置 git。如果你不想通过所有的服务器设置,我会推荐 github。

git-http://git-scm.com/(windows版本,去下载选择msysGit)

github - https://github.com/

【讨论】:

  • 尼尔在这里很到位。 Mercurial 和 git 都是不错的选择,您可以轻松编写一个简短的“自动更新”脚本,该脚本每 x 天调用一次,并且只提取最新版本的存储库。
【解决方案2】:

如果您尚未使用InnoSetup 打包您的程序,我强烈建议您切换到它,因为它具有使此类事情变得更容易的功能。您可以在 InnoSetup 脚本中指定任何特殊情况,例如如果文件已经存在则不应更新的文件(即,如果您有任何内部配置文件或类似的东西)。

接下来,为了让客户端机器了解您的应用程序的新版本,请在您的公共网络服务器上保留一个非常小的文件,其中包含当前版本的版本号和最新版本的安装程序 exe 的 URL。为了使这个文件有用,每当你发布一个更新版本的程序时,你必须更新这个文件,以及 InnoSetup 脚本中的版本号,以及你程序中的某种 APP_VERSION 常量。

然后,您需要自己处理更新程序的这些部分:

  1. 通过 HTTP 从您的 Web 服务器检索当前版本文件,并将其中的版本号与应用程序自己的 APP_VERSION 进行比较,从而检测何时有更新的版本可用。如果客户端计算机没有 Internet 访问权限,请确保以正常失败的方式执行此查询,并且在执行请求时不会阻塞 GUI(以防网络问题迫使查询等待很长一段时间超时)。
  2. 如果有更新的版本可用,询问用户是否要更新,如果他们说是,则将更新的安装程序下载到 TEMP 目录。根据您使用的 GUI 工具包,在下载过程中有多种显示进度对话框的机制;这是个好主意,因为安装程序可能至少有一个 MB。
  3. 关闭您的应用,运行一个特殊的更新脚本in the background,然后再次启动该应用。

更新脚本将等待原始进程完全终止(最简单的方法是将原始进程的 PID 作为命令行参数传递,并每隔一秒左右更新一次脚本send a query signal 0 to that process,直到它消失.) 然后它可以在后台静默运行安装程序,可能同时向用户显示“请稍候...”对话框。安装程序完成并在其返回代码中报告成功后,更新程序可以重新启动您的程序。

根据您的应用程序有多大,这比使用 git 或其他 SCM 的方法更浪费带宽。使用这种方法的每次更新都需要下载应用程序最新版本的整个安装程序,而 SCM 只会下载已更改的文件。但是,它的优点是它不需要特殊的服务器设施,只需要一个常规的 Web 服务器,并且不需要在用户的计算机上专门安装 SCM 客户端。

另外,InnoSetup 通常很酷。 :-)

【讨论】:

  • 检查现有应用程序是否仍处于打开状态的另一种技术上更贴心的方法是让您的应用程序在运行时获取具有预定名称的临时文件的读取锁定。这很酷,因为它避免了一种不太可能但可能的竞争条件场景,即您的应用程序释放其 PID 但另一个新应用程序立即采用相同的 PID。它还会阻止用户启动您的应用程序的多个实例,这可能会使更新程序感到困惑。
【解决方案3】:

对于那些想要研究一些不太过时的东西的人,我只是在研究如何创建可以远程更新的 python 应用程序(但不限于像 OP 这样的 Windows)。

似乎esky 是一段时间的解决方案。虽然它自 2018 年以来已被弃用。

最新和最新的解决方案似乎是pyinstallerpyupdater 的组合。请注意,我没有个人经验,我正在寻找朋友。

它似乎支持 windows、linux 和 Mac 以及 python 2 和 3,所以绝对值得一看。

【讨论】:

  • 这是推荐的现代答案。
猜你喜欢
  • 2010-09-12
  • 2023-03-28
  • 2016-10-20
  • 2021-09-25
  • 2015-11-17
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多