写在前面
有一说一,如果你的程序主要靠 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
方案三:一站式全能选手 —— 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 目录得到打包好的文件,终端还会直接生成一个云端下载链接。
一些建议
在 Python 客户端分发领域,没有完美的解决方案,只有相对最优
- 如果你的项目需要极致的代码掌控权且不介意修补旧轮子,PyUpdater 的逻辑依然值得参考。
- 如果你看重更新机制的安全性且项目规模较小,Tufup 是一个现代化的备选。
- 如果你希望以最低的时间成本解决分发难题,提供类似商业软件的更新体验,PyInstaller-Plus 是目前效率最高的选择。