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

升级pydrake至1.32后导出Diagram为SVG遇Unicode编码错误

解决pydrake 1.32导出SVG时的UnicodeEncodeError问题

问题根源

pydrake 1.32版本给废弃端口添加了UTF-8编码的墓碑emoji(\U0001faa6),但Mac OS Sonoma 14.5环境下的pydot默认采用ASCII编码处理dot数据,无法识别该emoji,从而触发编码错误。


解决方案

方案1:替换emoji为ASCII兼容标记

直接在获取Graphviz字符串后,将墓碑emoji替换为ASCII字符,避免编码冲突:

# 获取dot字符串并替换UTF-8 emoji
dot_content = diagram.GetGraphvizString().replace("\U0001faa6", "[DEPRECATED]")
# 生成SVG文件
pydot.graph_from_dot_data(dot_content)[0].create_svg("diagram.svg")

方案2:强制设置UTF-8编码环境

在执行导出代码前,设置系统和Python的编码环境变量,强制pydot使用UTF-8处理字符:

import os
# 强制全局编码为UTF-8
os.environ["PYTHONIOENCODING"] = "utf-8"
os.environ["LC_ALL"] = "en_US.UTF-8"

# 执行原导出逻辑
pydot.graph_from_dot_data(diagram.GetGraphvizString())[0].create_svg("diagram.svg")

方案3:绕开pydot,直接调用Graphviz命令行

跳过pydot的封装,直接使用Graphviz原生dot命令处理dot文件,彻底规避pydot的编码问题:

# 将dot内容写入文件
dot_str = diagram.GetGraphvizString()
with open("temp_diagram.dot", "w", encoding="utf-8") as f:
    f.write(dot_str)

# 调用dot命令生成SVG
import subprocess
subprocess.run(
    ["dot", "-Tsvg", "temp_diagram.dot", "-o", "diagram.svg"],
    check=True
)

补充说明

Linux环境默认系统编码为UTF-8,因此pydot可正常处理emoji;而Mac OS Sonoma 14.5中pydot默认依赖ASCII编码,才会出现该问题。上述三种方案均可解决编码错误,可根据实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:53:12