升级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
相关产品推荐
相关产品推荐

