使用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。