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

min*_*rus 9 c python swig

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

enum MyEnum {
    ONE,
    TWO,
    THREE
};
Run Code Online (Sandbox Code Playgroud)

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

我的api.i文件是:

%module api
%{
#include "myenum.h"
%}
%include "myenum.h"
Run Code Online (Sandbox Code Playgroud)

我用SWIG生成

swig -builtin -python api.i
Run Code Online (Sandbox Code Playgroud)

并将其导入Python

import _api
Run Code Online (Sandbox Code Playgroud)

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

_api.ONE
_api.TWO
_api.THREE
Run Code Online (Sandbox Code Playgroud)

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

_api.MyEnum.ONE
_api.MyEnum.TWO
_api.MyEnum.THREE
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*nen 2

有一个 SWIG 功能nspace确实可以满足您的需求,但不幸的是 Python 尚不支持它。我总是必须在结构中定义枚举,以便它以您想要的方式在 SWIG 中显示。例子:

%module tmp

%inline %{
struct MyEnum {
    enum { A,B,C };
};
%}
Run Code Online (Sandbox Code Playgroud)

结果:

>>> import tmp
>>> tmp.MyEnum.A
0
>>> tmp.MyEnum.B
1
>>> tmp.MyEnum.C
2
Run Code Online (Sandbox Code Playgroud)