使用PyInstaller生成的Python可执行文件自动更新

28

我有一个正在开发的桌面应用程序,使用PyInstaller生成分发文件。

我选择PyInstaller而不是py2exe是因为它非常易于使用,我不需要关心Windows dlls。但是当我使用py2exe时,我可以简单地使用Esky进行自动更新,但我无法将其与PyInstaller一起使用。

因此,我不知道如何启动自动更新的应用程序。有人有想法或者知道我该如何使用PyInstaller和Esky吗?


2
为什么不直接创建一个 .bat 文件,然后在 Windows 计划任务中安排它在每次启动/关闭/每小时运行? - Torxed
@Torxed,请记住您必须以“SYSTEM”身份运行它,否则命令提示符将弹出。 - Maciej Gol
你也可以在用户空间中运行它并强制隐藏提示,但是确实会有一个提示初始化。你还可以创建一个大约20行的Python服务脚本,让其运行一个“Pyinstaller”命令,并使用C:>python myservice.py install进行安装。 - Torxed
2
我们所做的是在互联网上有一个文件,定期检查文件中的版本号是否大于当前版本,并提示用户下载新的安装程序... 根据我的经验,自动更新是一项风险很高的业务。 - Joran Beasley
我认为@JoranBeasley的解决方案可能是我所做的最好的选择。但是,是的,它很难实现。如果下载停止或出现其他问题,我可以中断应用程序。 - Fernando Freitas Alves
相关链接:https://stackoverflow.com/q/12758088,https://stackoverflow.com/q/44810175 - undefined
5个回答

17
你可以创建一个启动器应用程序来添加所有的更新逻辑,启动器应用程序执行以下操作:
显示一个弹出窗口(这可以快速向用户反馈程序正在加载)
检查本地和仓库版本
如果本地 < 远程 (比如 v1.0 < v2.0) 那么:
.... 在远程存储库中检查是否存在名为 updater_v2.0.exe 的更新程序。
........ 如果有: 下载并运行它,然后退出。(见下文)
........ 如果没有: 下载最新的主应用程序 exe 并替换本地的应用程序(在此步骤中要注意文件访问权限——你试图写入 c:\program files)。
如果本地 > 远程,则:
.... 显示一个错误/警告除非这是开发者工作站(你需要进行设置)。
启动主应用程序。
更新程序的目的是适应无法获得新版主应用程序 exe 的情况。我还使用它来更新启动器应用程序本身(这就是为什么启动器一旦运行更新程序就会退出——顺便说一下,在尝试覆盖启动器可执行文件之前要给Windows一点时间)。

2
你很有可能通过这种方法找到一个开源应用程序,而且它可能会比视频更适合你的需求。我无法分享任何Python代码,因为我只在VBScript中实现过这个功能(根本不喜欢它)。我可以制作Python的视频,但为什么应该呢;-) - ndemou
不需要,谢谢。 - Ice Bear
@IceBear 你找到任何开源项目了吗? - Piyush
2
PyUpdater基本上可以在没有单独启动器的情况下完成此处所描述的操作。 - djvg
1
@djvg PyUpdater 已经不再维护,使用需自担风险。 - Cave Johnson123
显示剩余6条评论

11

还可以使用PyUpdater。我发现这里没有提到它。


1
你好,有没有关于使用PyUpdater进行自动更新部分的好教程?我所看到的只有一个wxpython应用程序的演示。 - elams
1
@elams 我也在寻找这个。如果你找到了什么东西,能否在下面发布一下,那就太好了。 - PrivateOmega
1
还有tufup包,以及示例应用程序 - djvg

7

我之前遇到过同样的问题,因此我编写了一个小型库(updater4pyi),可在Mac OS X、Linux和Windows上执行这个任务。例如,您可以从PyPI获取它:

> pip install updater4pyi

源代码仓库位于:https://github.com/phfaist/updater4pyi

这是一个小而不太成熟的项目。它的目的是尽可能灵活,不依赖于任何特定的GUI工具包。我已经在不同的平台上进行了一些测试,但可能仍有漏洞。希望对其他人也有用。


哇,我很高兴你做了这个,我很快就会试试! - Fernando Freitas Alves
3
只有当存储库未被归档时才能执行此操作 :( - Delrius Euphoria

1

0

截至今天,PyInstaller仅支持实验性的Python3。如果有人想使用Esky,我建议使用cx_Freeze。它支持Python 2和3,并可在Linux、Mac和Windows上运行。

然后您可以使用Esky。Esky具有使用引导机制的优点,因此您始终至少安装了一个可运行版本。


我已经使用Esky和cx Freeze,它们配合得非常好。 - Fernando Freitas Alves
1
@FernandoFreitasAlves Esky现在已经被存档了 :( - elams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接