我想知道使用SWIG将C中的字符串数组包装到Python列表的正确方法是什么。
数组在struct:
中typedef struct {
char** my_array;
char* some_string;
}Foo;
SWIG自动将 some_string 包装到python字符串。
我应该在SWIG界面文件中添加什么内容,以便我可以在Python中访问 my_array 作为常规Python字符串列表['string1','string2']?
我使用了typemap作为sugested:
%typemap(python,out) char** {
int len,i;
len = 0;
while ($1[len]) len++;
$result = PyList_New(len);
for (i = 0; i < len; i++) {
PyList_SetItem($result,i,PyString_FromString($1[i]));
}
}
但那仍然无效。在Python中,my_array变量显示为SwigPyObject:_20afba0100000000_p_p_char。
我想知道是不是因为char **在结构体内?也许我需要通知SWIG?
有什么想法吗?
答案 0 :(得分:1)
我认为在SWIG中无法自动处理此转换。您需要使用SWIG的Typemap功能并手动编写类型转换器。在这里,您可以找到从Python列表到char ** http://www.swig.org/Doc1.3/Python.html#Python_nn59的转换,因此完成了一半的工作。您现在需要做的是检查Typemap的其余文档并将转换器从char **写入Python列表。
答案 1 :(得分:0)
我不是这方面的专家,但我认为:
%typemap(python,out) char** {
适用于返回char **的函数。你的char **在一个结构中..看看swig生成的代码,以确认地图是否被应用。
您可能需要使用以下内容:
%typemap(python,out) struct Foo {
要有一个适用于返回的结构Foo的地图。
背景:我使用了与您使用的相同的类型映射定义,但后来成功地使用了char **。
答案 2 :(得分:-1)
我很抱歉略微偏离主题,但如果它是一个选项,我强烈建议使用ctypes而不是swig。这是我之前在ctypes上下文中提到的一个相关问题:Passing a list of strings to from python/ctypes to C function expecting char **