使用Swig在Python模块中包装C-enum

我在myenum.h中的C中有一个简单的枚举:

enum MyEnum { ONE, TWO, THREE }; 

问题是当我将它映射到Python时,我只能通过模块名称访问枚举,而不是通过MyEnum。 因此值ONE,TWO,THREE包含在我定义的任何其他函数中,而不是包含在MyEnum中。

我的api.i文件是:

 %module api %{ #include "myenum.h" %} %include "myenum.h" 

我用SWIG生成

 swig -builtin -python api.i 

并将其导入Python

 import _api 

现在我必须使用_api模块中的枚举值:

 _api.ONE _api.TWO _api.THREE 

虽然我想像他们一样使用它们

 _api.MyEnum.ONE _api.MyEnum.TWO _api.MyEnum.THREE 

有谁知道我怎么能做到这一点?

有一个SWIGfunctionnspace可以满足您的需求,但遗憾的是它还不支持Python。 我总是必须在结构中定义枚举,以便在SWIG中以您想要的方式显示它。 例:

 %module tmp %inline %{ struct MyEnum { enum { A,B,C }; }; %} 

结果:

 >>> import tmp >>> tmp.MyEnum.A 0 >>> tmp.MyEnum.B 1 >>> tmp.MyEnum.C 2 

您需要了解的是,在C中,枚举中的这些名称不是像Python中那样命名空间。 您可能应该阅读一些关于如何在继续之前使用枚举的内容。

现在请注意,由于这些是全局可访问的名称,因此它们不会在Python中进行命名空间。 你最好的选择是创建一个对象,沿着这些方向:

 class MyEnum: A = A B = B C = C del(A, B, C) 

然后只能通过_api.MyEnum.A等访问A,B,C,并且不能直接访问A,B,C。