[BUG] setup.sh Tkinter preflight uses dpkg package presence instead of Python import

用户在 Ubuntu 或类似 Ubuntu 的 Linux 发行版上,使用非系统自带的 Python(如从源码构建的 Python 3.10、pyenv、conda 或 Homebrew 管理的 Python)时,运行 ./setup.sh 脚本安装 Kohya SS 。该脚本在创建虚拟环境和安装依

[BUG] setup.sh Tkinter preflight uses dpkg package presence instead of Python import

[BUG] setup.sh Tkinter preflight uses dpkg package presence instead of Python import

快速结论:此问题发生在使用非系统包管理器安装的 Python(例如源码编译、pyenv、conda、Homebrew)运行 Kohya SS 的 setup.sh 时。即使该 Python 环境确实可以 import tkinter,安装脚本仍然因为缺少 APT 包 python3-tk 而报错并中断。优先排查你的 Python 是否来自系统包管理器以外的来源。

问题场景

用户在 Ubuntu 或类似 Ubuntu 的 Linux 发行版上,使用非系统自带的 Python(如从源码构建的 Python 3.10、pyenv、conda 或 Homebrew 管理的 Python)时,运行 ./setup.sh 脚本安装 Kohya SS。该脚本在创建虚拟环境和安装依赖之前,会先检查 Tkinter 是否可用,但检查方式不正确,导致安装中断。

报错原文

The installer reports that Tkinter is missing, even though Tkinter is available and working inside the virtual environment.

Script prints install instructions for `python3-tk` and exits with `exit 1` before venv creation / dependency install.

(注:脚本输出会包含提示安装 python3-tk 的指令,并直接退出。)

原因分析

根本原因是 setup.sh 脚本检测 Tkinter 的方式存在设计缺陷。脚本使用了以下命令来检查 Tkinter 是否可用:

if [ $(dpkg-query -W -f='${Status}' python3-tk 2>/dev/null | grep -c "ok installed") = 0 ]; then
    ...
    exit 1
fi

这种“包管理器代理检测”方法假定:只要系统的包管理器(APT)注册了 python3-tk 包,Python 就能导入 Tkinter。但在以下常见场景中,这个假设是错误的:

  • Python 从源码编译安装
  • 通过 pyenv、conda 或 Homebrew 安装的 Python
  • 虚拟环境
  • APT 包版本与当前使用的 Python 解释器版本不匹配

在这些情况下,Python 本身确实可以导入 Tkinter,但由于系统没有安装 APT 包,脚本会错误地认为 Tkinter 不可用,从而硬性中断安装。

此外,Tkinter 检查在创建虚拟环境之前、在 conda 环境处理逻辑之前就已经执行,因此检查时使用的 Python 解释器可能是错误的。

环境排查

  • Python 来源:确认你的 Python 是通过系统包管理器(apt)安装的,还是通过源码编译、pyenv、conda 或 Homebrew 管理的。这可以通过 which python3python3 --version 的输出路径来判断。
  • APT 包状态:运行 dpkg-query -W -f='${Status}' python3-tk,查看是否返回“ok installed”。如果有则不受此问题影响。
  • Python 导入测试:运行 python3 -c "import tkinter; print('Tkinter available')",确认当前 Python 环境是否能正常导入 tkinter。
  • Python 命令别名:注意 setup.sh 中后续依赖安装使用的是 get_python_command() 函数(依次尝试 python3.11python3.10python3python),所以简单的 python -c "import tkinter" 测试也可能指向错误的解释器。

解决步骤

本问题已在 Kohya SS 仓库的 Issue #3459 中报告并关闭。在官方修复之前,可以手动修改 setup.sh 脚本来规避问题。

  1. 找到 setup.sh 脚本:定位到你 Kohya SS 安装目录下的 setup.sh 文件。
  2. 备份脚本:复制一份原始脚本,以防需要回退:cp setup.sh setup.sh.bak
  3. 定位 Tkinter 检查代码:在脚本中搜索 dpkg-query(或 python3-tk)。在 Issue 提到的版本中,该检查位于大约第 490 行,最新的代码可能在行 505-514 附近。你会看到一段类似的代码块:
    if [ $(dpkg-query -W -f='${Status}' python3-tk 2>/dev/null | grep -c "ok installed") = 0 ]; then
        echo "..."
        ...
        exit 1
    fi
  4. 替换检测逻辑(推荐方案):将上一步找到的整个 if ... fi 代码块(包括其中的 exit 1)替换为基于 Python 导入的新检测逻辑。注意应使用脚本将使用的目标 Python 解释器。一个可行的替换方案如下:
    if ! get_python_command -c "import tkinter" >/dev/null 2>&1; then
        echo "Tkinter is not available for $(get_python_command). Please ensure it is installed for your Python interpreter."
        exit 1
    fi

    说明:get_python_commandsetup.sh 脚本中定义的一个函数,用于确定正确的 Python 命令。使用它比只用 python 更可靠。如果 get_python_command 不可用(这不太可能),可优先尝试使用 python -c "import tkinter" 作为更简单的替代方案。

  5. 保存并重新运行:保存修改后的 setup.sh,然后重新执行 ./setup.sh 脚本。

验证方法

修改脚本并运行后,观察输出是否不再因 Tkinter 问题而报错。如果脚本能够继续创建虚拟环境并安装 Python 依赖,则问题已解决。如果遇到其他错误,则需排查其他问题。

参考来源

bmaltais/kohya_ss #3459

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 12314

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注