SWIG将无符号字符*从C返回到Python

时间:2016-09-22 02:03:07

标签: python c swig

我遇到了为底层C代码生成python接口的问题。 我有以下几段代码:

prov.h

#include<string.h>
#include<stdio.h>
#include<stdlib.h>

unsigned char *out();

prov.c

#include "prov.h"

unsigned char *out()
{
    unsigned char *bytes="Hello";
    unsigned char *data=NULL;
    data=calloc(6,sizeof(char));
    if(data) {
        strncpy(data,bytes,6);
    }
    return data;
}

prov.i

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

unsigned char *out();

我生成了.so,如下所示:

$ swig -python prov.i
$ gcc -fpic -c prov.c  prov_wrap.c -I/usr/include/python2.7
$ gcc -shared prov.o prov_wrap.o -o _prov.so
$ python
Python 2.7.3 (default, Jun 22 2015, 19:33:41) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import prov
>>> s=prov.out()
>>> s
<Swig Object of type 'unsigned char *' at 0x7fb241dbff90>

现在的问题是,当我尝试从我的C函数中查看返回的字符串时,它似乎不会将其显示为python字符串对象(我预计当我打印时输出应为& #39;你好&#39;)。有人可以帮我解决将unsigned char *返回到python调用代码的问题吗?

1 个答案:

答案 0 :(得分:0)

改为返回char*,或者您可以将char*字形图应用于unsigned char*。在将返回结果转换为Python对象之后,您还希望%newobject让Python知道释放返回的指针。

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

%apply char* {unsigned char*};    
%newobject out;
unsigned char *out();