pycapnp导入类型不可见求助:结构体字段缺失
问题分析与解决
问题1:打印Vec2实例时缺失y字段
Cap'n Proto Python绑定中,print(instance)仅输出已被显式赋值的字段。对于嵌套的struct类型字段(比如y: Vec),默认处于未初始化状态(未分配内存),因此不会被打印。
解决方法
显式初始化y字段后,打印就会显示该字段:
import capnp capnp.remove_import_hook() schema = capnp.load('vec2.capnp') instance = schema.Vec2.new_message() # 初始化y字段并赋值 instance.y = schema.Vec2.y.schema.new_message(x=1.0) print(instance)
此时输出会变为:(x = 0, y = (x = 1))
如果需要查看所有字段(即使未赋值),可以遍历类型的字段描述:
for field in schema.Vec2.fields: print(f"{field.name}: {field.proto.slot.type}")
问题2:无法从vec2.capnp加载的schema中找到Vec类型
加载vec2.capnp时,导入的Vec类型不会自动挂载到顶层schema对象中,需通过schema的imports属性访问,或直接加载vec1.capnp获取该类型。
解决方法
方法1:从vec2的schema imports中获取
import capnp capnp.remove_import_hook() schema = capnp.load('vec2.capnp') # 获取对应vec1.capnp的导入schema vec1_schema = schema.imports[0] Vec = vec1_schema.Vec # 使用Vec类型创建实例 vec_instance = Vec.new_message(x=2.0)
方法2:直接加载vec1.capnp
import capnp capnp.remove_import_hook() # 直接加载vec1.capnp获取Vec类型 vec1_schema = capnp.load('vec1.capnp') Vec = vec1_schema.Vec # 同时加载vec2的schema vec2_schema = capnp.load('vec2.capnp')
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

