如何从Python调用C编写的GObject类方法?实例化及调用报错求解
问题根源
你使用了错误的GObject类型声明宏。G_DECLARE_DERIVABLE_TYPE 用于声明允许外部代码派生的类,要求你必须手动定义公开的实例结构体,且结构体第一个成员为父类实例。你当前没有定义该实例结构体,导致生成的introspection元数据缺失核心类型信息,PyGObject无法正确识别这是GObject子类,才会出现类型校验失败、实例化流程异常、段错误等问题。
解决方案
有两种适配方案,按需选择即可:
方案1:改为不可派生的Final类型(推荐,适配你当前的代码写法)
如果你的类不需要对外提供派生能力,直接替换声明宏即可:
将 bop.h 中的
G_DECLARE_DERIVABLE_TYPE(BopFooObj, bop_foo_obj, BOP, FOO_OBJ, GObject);
替换为
G_DECLARE_FINAL_TYPE(BopFooObj, bop_foo_obj, BOP, FOO_OBJ, GObject);
G_DECLARE_FINAL_TYPE 会自动处理实例结构体的定义,完全适配你当前使用 G_DEFINE_TYPE_WITH_PRIVATE 存储私有成员的写法。
方案2:保留可派生能力,补充公开实例结构体定义
如果你确实需要允许其他代码派生该类,在 bop.h 中 G_DECLARE_DERIVABLE_TYPE 语句下方补充实例结构体定义:
struct _BopFooObj { GObject parent_instance; /* 如有需要可在此添加公开的实例成员,无则仅保留父类成员即可 */ };
后续操作
修改代码后重新编译动态库,重新生成 .gir 和 .typelib 文件,再运行Python代码即可恢复正常:Bop.FooObj() 和 Bop.FooObj.new() 两种实例化方式都可以正常工作,方法调用也不会抛出异常。
内容的提问来源于stack exchange,提问作者AHM
相关产品推荐
相关产品推荐

