从C char *到python string的SWIG类型映射

时间:2016-07-22 13:45:55

标签: python c swig typemaps

我正在尝试使用SWIG在Python中使用C库。这个C库通过各处的参数传递函数结果。使用在线SWIG手册,我成功地获得了传递给Python的整数函数结果,但是我很难弄清楚如何为字符串执行此操作。

这是我的代码的本质:

myfunc.c

#include <myfunc.h>

#include <stdio.h>


int mystr(int inp, char *outstr){
   outstr="aaa";
   printf("%s\n", outstr);
   return(0);
}

myfunc.h

extern int mystr(int inp, char *outstr);

所以基本上我的问题是* outstr的typemap应该是什么样的。

提前致谢。

2 个答案:

答案 0 :(得分:1)

查看SWIG手册9.3.4 String handling: cstring.i。这提供了几个用于char *参数的类型映射。

可能(假设你确实使用上面评论中提到的strcpy(outstr, "aaa"))你想要在SWIG接口文件中,在函数声明之前,例如:

%include <cstring.i>
%cstring_bounded_output(char* outstr, 1024);

答案 1 :(得分:0)

这就是我通过修改SWIG 2.0 manual的第34.9.3节中的示例来实现它的方法:

%typemap(in, numinputs=0) char *outstr (char temp) {
   $1 = &temp;
}
%typemap(argout) char *outstr {

    PyObject *o, *o2, *o3;
    o = PyString_FromString($1);
    if ((!$result) || ($result == Py_None)) {
        $result = o;
    } else {
        if (!PyTuple_Check($result)) {
            PyObject *o2 = $result;
            $result = PyTuple_New(1);
            PyTuple_SetItem($result,0,o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3,0,o);
        o2 = $result;
        $result = PySequence_Concat(o2,o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
    }
}