为什么IPython中首次导入tensorboardX的SummaryWriter报错,第二次执行正常
问题成因
这个现象的核心是Protobuf全局描述符池的命名冲突,结合Python模块导入缓存机制共同导致,具体逻辑如下:
- 你当前使用的tensorboardX版本自带了一套预编译的protobuf定义文件,存放在
tensorboard/src/路径下;同时tensorboardX依赖的官方tensorboard包也自带一套protobuf定义,存放在tensorboard/compat/proto/路径下。两套定义里都声明了TensorShapeProto等同名消息结构,且都归属tensorboard这个公共包命名空间。 - 首次执行
from tensorboardX import SummaryWriter时,导入链路会先加载tensorboardX自带的protobuf定义,写入全局唯一的Protobuf描述符池;后续流程加载官方tensorboard的同名protobuf定义时,检测到命名空间下的消息结构已经被注册,就会抛出你看到的重复定义错误。 - 第二次执行相同导入语句时,Python内置的模块导入缓存机制已经将第一次加载过的tensorboardX相关模块标记为「已导入」,不会再次走完整的初始化加载流程,也不会重复尝试注册Protobuf描述符,因此不会再报错。
临时规避方案(可选)
- 升级tensorboardX到2.2及以上版本,官方已经修复了该冲突问题
- 首次导入前先执行
import tensorboard,让官方的protobuf定义优先注册到描述符池,也可以避免冲突
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

