你的python程序也能自动更新了

61 阅读3分钟

写在前面

有一说一,如果你的程序主要靠 UI,那我建议你下一个项目可以考虑 Electron 或 Tauri;但大多数时候,我们离不开 Python 是因为舍不得它的第三方库生态

作为写了五年Python开发的程序员,除了web后端项目,大多数爬虫,AI程序都会遇到打包的问题,客户希望拿到程序就能跑,甚至是拿到链接就能在多台电脑安装运行,这种情况下git就完全派不上用场了。每一次更新都需要手动发包,客户更新也非常麻烦,替换这个替换那个,体验非常差还容易出现各种。

找了一圈现在整理了一些Python打包和自动更新的方案,聊聊如何在 Python 程序中实现相对优雅的自动更新。

方案一: PyUpdater

如果你是使用 PyInstaller 打包程序的,那么 PyUpdater 是目前最成熟的解决方案。它是专门围绕 PyInstaller 构建的生态系统。

接入代码

from pyupdater.client import Client
from client_config import ClientConfig

def check_for_update():
    client = Client(ClientConfig())
    client.refresh()
    
    app_update = client.update_check(client.app_name, client.app_version)
    
    if app_update:
        print("发现新版本!正在下载...")
        app_update.download()
        if app_update.is_downloaded():
            print("下载完成,正在重启并应用更新...")
            app_update.extract_restart()
    else:
        print("当前已是最新版本。")

PyUpdater 配置稍微繁琐(需要生成密钥、配置 S3 或其他存储后端),总体上还算一个不错的选择

但是有一个最大的问题就是已经四年没有维护了


方案二:轻量级现代方案 —— Tufup

PyUpdater 虽然强大,但维护频率在近年来有所下降,四年没有维护确实让开发者有些顾虑。如果你在寻找更现代的替代品,Tufup 可以考虑作为一个选择

它基于 TUF (The Update Framework) 安全标准,专注于解决软件更新中的安全漏洞

关键代码


client = Client(
	app_name="my_app", # 必须和 tufup add 时的名字一致
	app_install_dir=os.path.dirname(sys.executable),
	current_version=CURRENT_VERSION,
	metadata_base_url=f"{REPO_URL}metadata/",
	target_base_url=f"{REPO_URL}targets/"
)

# 3. 刷新元数据 -> 检查 -> 下载 -> 覆盖 -> 重启
client.refresh()
if client.check_for_updates():
	# 这一步会自动完成下载并重启,无需额外代码
	client.download_and_apply_update() 

缺点就是欠缺维护,133 star image.png

方案三:一站式全能选手 —— PyInstaller-Plus

如果你希望在找一个和Python生态一样优雅分发方案, pyinstaller-plus可能是你的菜

完全兼容pyinstaller,配合 DistroMate 软件分发助手(不限编程语言和框架),10 分钟内搞定 生成安装包 + 直链分发 + 自动增量更新 + 用户数据统计 + 远程授权(可选)

快速接入指南:

第一步:安装与登录

pip install pyinstaller-plus
# 登录 DistroMate 账号(需先在官网注册)
distromate login

第二步:创建应用与配置DistroMate 后台 创建应用后,在项目根目录新建distromate.yml

appid: your_app_id_here  
name: QuestionDownload  
description: 题库下载工具  

package:
  name: questiondownload
  executable: dist/download_question_gui.exe # 你的主程序入口
  target: dist
  publisher: My Studio
  
# 更新时保留的文件(防止更新后用户配置丢失,非常贴心的功能)
preservePaths:  
  - config/
  - data/
  
ignores:  
  - "*.log"

第三步:一键打包发布 使用 -p 参数开启发布模式,并指定版本号:

# your.spec 是你原本的 pyinstaller spec 文件
pyinstaller-plus -p --dm-version 1.0.0 your.spec

运行结束后,你不仅会在 dm-out 目录得到打包好的文件,终端还会直接生成一个云端下载链接

image.pngimage.png

一些建议

在 Python 客户端分发领域,没有完美的解决方案,只有相对最优

  • 如果你的项目需要极致的代码掌控权且不介意修补旧轮子,PyUpdater 的逻辑依然值得参考。
  • 如果你看重更新机制的安全性且项目规模较小,Tufup 是一个现代化的备选。
  • 如果你希望以最低的时间成本解决分发难题,提供类似商业软件的更新体验,PyInstaller-Plus 是目前效率最高的选择。