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

时间:2013-05-09 21:12:46

标签: python c swig

我在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

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

2 个答案:

答案 0 :(得分:1)

有一个SWIG功能nspace可能会让你想要,但遗憾的是它还不支持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

答案 1 :(得分:1)

您需要了解的是,在C中,枚举中的这些名称不是像Python中那样命名空间。你应该在继续之前阅读一些关于enums can be used的内容。

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

class MyEnum:
   A = A
   B = B
   C = C

del(A, B, C)

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