You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包Tkinter SSH隧道应用:用户输入无法持久化求助

问题原因及解决方案

核心问题

你遇到的是PyInstaller --onefile 模式的典型特性:打包后的exe运行时会将所有资源(包括你添加的default_values.json)解压到系统临时目录,你修改的是临时目录里的文件,程序退出后临时目录会被自动清理,下次启动时会重新解压原始的配置文件,导致修改无法保留。

解决步骤

1. 分离默认配置与用户配置

不要直接修改打包进去的默认配置文件,而是在首次启动时将默认配置复制到用户可读写的持久化目录(比如用户个人目录下的专属文件夹),后续所有读取和修改操作都针对这个持久化配置文件。

2. 修改代码中的路径处理逻辑

替换你原来的配置文件读写代码,示例如下:

import os
import sys
import json

def get_user_config_path():
    # 创建用户专属配置目录(比如用户目录下的.ssh_tunnel_app文件夹)
    app_config_dir = os.path.join(os.path.expanduser("~"), ".ssh_tunnel_app")
    os.makedirs(app_config_dir, exist_ok=True)
    # 返回用户配置文件路径
    return os.path.join(app_config_dir, "user_config.json")

def get_default_config_path():
    # 获取打包后的默认配置文件路径(开发/打包环境兼容)
    if hasattr(sys, '_MEIPASS'):
        # 打包运行时,_MEIPASS是临时解压目录
        return os.path.join(sys._MEIPASS, "default_values.json")
    else:
        # 开发环境下的默认配置路径
        return "default_values.json"

# 初始化用户配置
user_config_path = get_user_config_path()
if not os.path.exists(user_config_path):
    # 首次启动,复制默认配置到用户目录
    with open(get_default_config_path(), 'r', encoding='utf-8') as f:
        default_config = json.load(f)
    with open(user_config_path, 'w', encoding='utf-8') as f:
        json.dump(default_config, f, indent=2)

# 读取用户配置
with open(user_config_path, 'r', encoding='utf-8') as f:
    config = json.load(f)

# 修改配置后保存到用户配置文件(示例)
config['ssh_address_or_host'] = "你的新地址"
with open(user_config_path, 'w', encoding='utf-8') as f:
    json.dump(config, f, indent=2)

3. 保持原有PyInstaller打包参数不变

你的打包脚本无需修改,--add-data default_values.json;. 依然需要,用于将默认配置文件打包进exe。

额外注意事项

  • 如果希望将配置文件放在exe所在目录,可替换get_user_config_path为:
    def get_user_config_path():
        # 获取exe所在目录
        exe_dir = os.path.dirname(os.path.abspath(sys.executable))
        return os.path.join(exe_dir, "user_config.json")
    
    但要注意:如果exe放在Program Files等需要管理员权限的目录,写入配置文件会失败,此时仍推荐使用用户个人目录。

内容的提问来源于stack exchange,提问作者Rami Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:45:56