如何远程更新Python应用程序

32 投票
4 回答
26979 浏览
提问于 2025-04-16 22:50

用什么方法把改动推送到用Python写的程序里最好呢?我有一个用Python写的软件,之后会定期更新。那最好的做法是什么呢?所有的机器都在用Windows 7。

另外,抱歉我问题问得不够清楚。这是我第一次要实施更新的流程。如果你有想让我补充的具体内容,请随时告诉我。

4 个回答

3

如果你想了解一些比较新的东西,我刚刚在研究如何创建可以远程更新的Python应用程序(虽然不局限于Windows系统)。

看起来esky这个工具已经存在了一段时间,不过自2018年起就不再更新了。

目前最新、最实用的解决方案似乎是将pyinstallerpyupdater结合使用。需要注意的是,我没有亲自使用过这些工具,只是在帮朋友寻找信息。

这些工具似乎支持Windows、Linux和Mac系统,而且兼容Python 2和3,所以值得一试。

8

我建议你使用一些源代码管理工具,比如git或者subversion。如果你不介意别人看到你的代码,可以把代码放在github上,任何人都可以从那里下载。如果你想让代码私密,那就得付费,而且所有用户也需要创建一个github账号,并把它和他们的git安装设置好。

如果你使用源代码管理工具,其他人需要手动运行一个命令来获取更新,但你可以做一个脚本或者批处理文件,让它在启动时或定期自动运行。

需要说明的是,如果你想这样做,你得把代码放在一个支持SSH的服务器上,并设置好git。如果你不想搞那么复杂的服务器设置,我建议你直接用github。

git - http://git-scm.com/(对于Windows版本,可以去下载页面选择msysGit)

github - https://github.com/

23

如果你还没有用InnoSetup来打包你的程序,我强烈建议你换用它,因为它能让这些事情变得更简单。你可以在InnoSetup脚本中指定一些特殊情况,比如如果某些文件已经存在就不更新它们(例如,如果你有一些内部配置文件之类的)。

接下来,为了让用户的电脑能找到你应用的新版本,你需要在你的公共网页服务器上放一个非常小的文件,这个文件里包含当前版本的版本号和最新版本安装程序的链接。为了让这个文件有用,每次你发布新版本时,都必须更新这个文件、InnoSetup脚本中的版本号,以及你程序中的某个APP_VERSION常量。

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

  1. 通过HTTP从你的网页服务器获取当前版本文件,检查那里的版本号和你应用的APP_VERSION进行比较,以检测是否有新版本可用。确保这个查询在用户的电脑没有网络时能优雅地失败,并且在请求期间不会阻塞图形界面(以防网络问题导致请求等待很久)。
  2. 如果有新版本可用,询问用户是否想要更新,如果他们同意,就下载更新的安装程序到临时目录。根据你使用的图形界面工具包,有多种方式可以在下载过程中显示进度对话框;这是个好主意,因为安装程序可能至少有1MB。
  3. 关闭你的应用,运行一个特殊的更新脚本在后台,然后再启动应用。

更新脚本会等待原来的进程完全结束(最简单的方法是把原进程的PID作为命令行参数传入,然后让更新脚本每秒发送一个查询信号0给那个进程,直到它消失)。然后它可以在后台静默运行安装程序,可能还会给用户显示一个“请稍候...”的对话框。一旦安装程序完成并返回成功的代码,更新程序就可以重新启动你的应用。

根据你的应用大小,这种方法比使用git或其他源代码管理工具更浪费带宽。每次更新都需要下载最新版本应用的整个安装程序,而源代码管理工具只会下载那些发生变化的文件。不过,它的好处是只需要一个普通的网页服务器,不需要在用户的电脑上安装特殊的源代码管理工具客户端。

而且,InnoSetup本身就很酷。:-)

撰写回答