2016-09-22 4 views
0

У меня возникла проблема с созданием интерфейса для python с базовым кодом C. У меня есть следующие фрагменты кода:SWIG return unsigned char * от 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> 

Теперь проблема заключается в том, что когда я пытаюсь просмотреть возвращенную строку s из моей функции C, она, похоже, не показывает ее как строковый объект python (я ожидал, когда я напечатаю s, вывод должен быть «Hello» «). Может ли кто-нибудь помочь мне с возвратом unsigned char * в код вызова python?

ответ

0

Вместо этого верните char*, или вы можете применить коды char* к unsigned char*. Вам также понадобится %newobject, чтобы позволить Python узнать, как вернуть возвращаемый указатель после преобразования результата возврата в объект Python.

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

%apply char* {unsigned char*};  
%newobject out; 
unsigned char *out(); 
Смежные вопросы