使用Swig将C-enum封装为Python模块

9

我有一个简单的C语言枚举在myenum.h头文件中:

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

有人知道我如何实现这个吗?

(涉及IT技术,具体内容需要上下文理解)

4
Thd_api模块是私有的,您不应直接使用它。 - Flexo
2个回答

2

有一个 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
你需要理解的是,在C语言中,枚举中的名称不像在Python中那样有命名空间。在继续之前,你应该阅读一些关于如何使用枚举的内容。
现在请注意,由于这些名称是全局可访问的,它们在Python中也不会有命名空间。你最好创建一个对象,类似于以下方式:
class MyEnum:
   A = A
   B = B
   C = C

del(A, B, C)

那么 A、B、C 只能通过 _api.MyEnum.A 等方式访问,而不能直接访问 A、B、C。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接