![[BUG] setup.sh Tkinter preflight uses dpkg package presence instead of Python import](https://www.chat-gpts.plus/wp-content/uploads/2026/07/3459-9c16c4b2.jpg)
[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 python3或python3 --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.11→python3.10→python3→python),所以简单的python -c "import tkinter"测试也可能指向错误的解释器。
解决步骤
本问题已在 Kohya SS 仓库的 Issue #3459 中报告并关闭。在官方修复之前,可以手动修改 setup.sh 脚本来规避问题。
- 找到
setup.sh脚本:定位到你 Kohya SS 安装目录下的setup.sh文件。 - 备份脚本:复制一份原始脚本,以防需要回退:
cp setup.sh setup.sh.bak。 - 定位 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 - 替换检测逻辑(推荐方案):将上一步找到的整个
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_command是setup.sh脚本中定义的一个函数,用于确定正确的 Python 命令。使用它比只用python更可靠。如果get_python_command不可用(这不太可能),可优先尝试使用python -c "import tkinter"作为更简单的替代方案。 - 保存并重新运行:保存修改后的
setup.sh,然后重新执行./setup.sh脚本。
验证方法
修改脚本并运行后,观察输出是否不再因 Tkinter 问题而报错。如果脚本能够继续创建虚拟环境并安装 Python 依赖,则问题已解决。如果遇到其他错误,则需排查其他问题。



