将C枚举导入python而不包含完整标题?

时间:2018-02-16 21:45:44

标签: python c enums swig

有没有一种简单的方法可以使用SWIG将C头文件中定义的枚举常量暴露给Python,但是没有使用%include "header.h"来整个标题?换句话说,我手动编写SWIG接口,因为我不想为所有内容自动生成python绑定。但是,头文件中定义了枚举,我想让Python端可用。我的文件看起来像这样:

foo.h中

typedef enum fooEnumType {
    CAT, DOG, HORSE
} fooEnum;

foo.i

%module foo
%{
#include "foo.h"
%}

foo.i中,我可以在我的C代码中访问CAT。当然,Python端不提供CATDOGHORSE。我如何将它们暴露给Python?

1 个答案:

答案 0 :(得分:1)

只需在foo.h文件中添加foo.i所需的部分,而不是处理所有内容的%include "foo.h"

<强> foo.i

%module foo
%{
#include "foo.h"
%}

typedef enum fooEnumType {
    CAT, DOG, HORSE
} fooEnum;

<强> foo.h中

typedef enum fooEnumType {
    CAT, DOG, HORSE
} fooEnum;

typedef enum otherEnumType {
    A, B, C
} otherEnum;

输出:

>>> import foo
>>> dir(foo)
['CAT', 'DOG', 'HORSE', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '_
_spec__', '__warningregistry__', '_foo', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig
_setattr', '_swig_setattr_nondynamic']

请注意,CAT / DOG / HORSE已定义,但A / B / C未定义。 swig -python foo.i生成了包装器而没有错误。