Heroku部署Django应用报No module named '_tkinter'错误如何解决
修复方案
1. 处理意外安装的matplotlib
- 首先在本地环境安装依赖树排查工具:
pip install pipdeptree - 执行命令查找引入matplotlib的上游依赖:
pipdeptree | grep -A5 -B5 matplotlib,确认是哪个依赖包附带安装了matplotlib - 如果该上游依赖是本地调试用、生产环境不需要的,直接从
requirements.txt中移除;如果是生产必需的依赖,优先选择该依赖的无matplotlib可选版本,比如安装时排除可选依赖 - 清理Heroku旧的构建缓存,避免残留依赖影响:
heroku builds:cache:purge -a 你的Heroku应用名称 - 重新编写
requirements.txt,不要直接使用pip freeze导出全量依赖,仅保留项目生产环境实际需要的依赖项
2. 解决PySimpleGUI依赖tkinter的报错
Heroku的运行环境为无图形界面的无头服务环境,默认不提供tkinter等GUI相关依赖,因此不能使用默认基于tkinter的PySimpleGUI版本,可根据实际使用场景选择对应方案:
- 若PySimpleGUI仅为本地调试工具、生产环境无使用需求:
- 从
requirements.txt中移除PySimpleGUI依赖 - 在项目代码中给PySimpleGUI的引入逻辑加环境判断,仅本地环境执行导入:
import os # 本地开发环境提前配置ENV环境变量为local,生产环境不需要配置 if os.getenv("ENV") == "local": import PySimpleGUI as sg else: sg = None - 从
- 若生产环境需要使用PySimpleGUI的相关能力:
- 将
requirements.txt中的PySimpleGUI替换为PySimpleGUIWeb,该版本基于Web后端实现,无tkinter依赖,接口与原版PySimpleGUI基本兼容 - 将项目中
import PySimpleGUI as sg的语句替换为import PySimpleGUIWeb as sg,无需修改其他业务逻辑即可正常运行
- 将
附加:若生产环境必须使用matplotlib
如果排查后确认matplotlib是生产必需依赖,在Django项目的settings.py文件首行加入以下配置,指定matplotlib使用无头后端,避免其调用tkinter:
import matplotlib matplotlib.use("Agg")
内容的提问来源于stack exchange,提问作者Chinmay Datar
相关产品推荐
相关产品推荐

