Python:SWIG:包裹对结构的访问

时间:2016-06-28 15:56:01

标签: python c swig

假设我有一个简单的结构,只有一个字段:

typedef struct {
    MY_UNICODE value[512];
} TEST_STRUCTURE

其中MY_UNICODE是自定义unicode实现。 另外我有两种方法:

int UTF8ToMyUnicode(char *utf8, MY_UNICODE *unicode);
int MyUnicodeToUTF8(MY_UNICODE *unicode, char *utf8);

要转换为此自定义类型。 现在我可以使用SWIG为此生成一个Python接口。 但是当我尝试在Python中访问TESTSTRUCTURE.value时。我总是指向一个MY_UNICODE对象。

我的问题是:如何包含对结构成员的访问权限,以便获取python字符串并使用python字符串设置值?

我知道SWIG的文档说明了memberin typemap。 但我的例子不起作用:

%module test
%include "typemaps.i"
// This is the header file, where the structure and the functions are defined
%include "test.h"

%typemap(memberin) MY_UNICODE [512] {
    if(UTF8ToMyUnicode($1, $input) != 0) {
        return NULL;
    }
}

%typemap(memberout) MY_UNICODE [512] {
    if(MyUnicodeToUTF8($1, $input) != 0) {
        return NULL;
    }
}    

在生成的包装器文件中,尚未应用地图。

任何帮助将不胜感激!谢谢!

PS:我正在使用swig 2.0.10

1 个答案:

答案 0 :(得分:2)

我自己解决了这个问题。重要的是,在界面中定义结构之前,需要定义类型映射。文档不清楚(或者我还没有看到)。此外,“输入”和“输出”类型映射可用于转换值。 这个例子对我有用:

%module test
%include "typemaps.i"

%typemap(in) MY_UNICODE [512] {
    if(UTF8ToMyUnicode($1, $input) != 0) {
        return NULL;
    }
}

%typemap(out) MY_UNICODE [512] {
    if(MyUnicodeToUTF8($1, $result) != 0) {
        return NULL;
    }
}
// Now include the header file
%include "test.h"