解决graphviz.backend无ENCODING属性报错的方法
问题根因
Module 'graphviz.backend' has no attribute 'ENCODING' 报错的核心原因是graphviz 0.19及以上版本移除了backend模块下的ENCODING全局常量,而旧版本xgboost、scikit-learn的树模型可视化接口仍在调用这个已删除的属性。哪怕仅执行import graphviz,只要关联依赖触发属性校验就会抛出该错误,和你是否调用绘图接口无关。
修复方案
方案1:固定版本降级(兼容性最好,适配xgboost树绘图场景)
直接安装经过大量验证的兼容版本,步骤如下:
- 先彻底卸载当前环境中存在问题的graphviz包,避免多版本残留冲突:
# pip环境执行 pip uninstall -y graphviz # conda环境执行,和上面的命令二选一即可 conda remove -y graphviz
- 安装兼容的稳定版本,0.17版本是目前和xgboost树绘图接口适配度最高的版本,不存在ENCODING属性缺失问题:
# pip环境执行 pip install graphviz==0.17 # conda环境执行,和上面的命令二选一即可 conda install -y graphviz=0.17
- 修复验证:在Python交互环境执行以下代码,无报错即修复成功
import graphviz # 能正常输出'utf-8'说明缺失的属性已存在 print(graphviz.backend.ENCODING)
避坑提示:不要安装0.18、0.19、0.20及以上版本,这些版本要么移除了ENCODING常量,要么存在其他和旧版xgboost接口不匹配的参数问题。
方案2:热修复(不降级版本时使用)
如果其他项目依赖要求必须使用高版本graphviz,可以在导入xgboost绘图模块前,手动给backend模块补全缺失的常量,把以下代码加到脚本最开头即可:
import graphviz.backend # 手动补全高版本移除的ENCODING常量 graphviz.backend.ENCODING = 'utf-8' # 之后再正常导入xgboost、编写绘图逻辑即可 import xgboost as xgb from xgboost import plot_tree # 后续模型训练、导出树结构的代码不需要改动
常见踩坑说明
- 不要混淆Python层的graphviz包和系统层的graphviz二进制程序:如果降级完成后提示找不到
dot命令,属于系统层未安装graphviz程序的问题,和本次ENCODING报错无关。Windows用户可下载对应系统版本的安装包并添加到系统环境变量,Linux用户执行sudo apt install graphviz,Mac用户执行brew install graphviz即可解决。 - 如果安装完版本不符合预期,执行
pip show graphviz查看输出的版本号和安装路径,确认包装到了你当前使用的Python/conda环境里,避免多环境切换导致的安装位置错误。
内容的提问来源于stack exchange,提问作者mblume
相关产品推荐
相关产品推荐

