Estoy intentando poder utilizar desde Python librer�as creadas en C, por
lo que he podido ver el m�todo m�s sencillo es utilizar "swig", pero por
alg�n motivo esto no me funciona. He estado buscando diversos manuales
por internet y parece que todo fuese correcto, pero no tira.

Esto es lo que he hecho:

************************************************
*** Archivo prov.h:

typedef struct binary_data {
    int size;
    unsigned char* data;
} binary_data;

int insert(unsigned char *bytes, int len);

binary_data out();

*** Archivo prov.c:

#include "prov.h"

int length = 0;
unsigned char data[1024];

int insert(unsigned char *bytes, int len)
{
    strncpy(data, bytes, len);
    length = len;
}

binary_data out()
{
    binary_data result;
    result.size = length;
    result.data = data;
    return result;
}

*** Archivo prov.i:

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

%typemap(python,in) (unsigned char *bytes, int len)
{
  if (!PyString_Check($input)) {
    PyErr_SetString(PyExc_ValueError,"Expected a string");
    return NULL;
  }
  $1 = PyString_AsString($input);
  $2 = PyString_Size($input);
}

int insert(unsigned char *bytes, int len);

%typemap(out) binary_data {
    $result = PyString_FromStringAndSize($1.data,$1.size);
}

binary_data out();

*** Archivo Makefile:

SWIG=/usr/bin/swig

CFLAGS=-DDEBUG -I/usr/include/python2.3 -I/usr/lib/python2.3/config

all:    prov.so

prov.o prov_wrap.o: prov.i prov.c prov.h
        $(SWIG) -python prov.i
        gcc $(CFLAGS) -c prov.c prov_wrap.c 

prov.so: prov_wrap.o prov.o
        ld -shared prov.o prov_wrap.o -o prov.so 

clean:
        rm prov.o prov_wrap.* prov.so

****************************************************************

Tras crear todos estos ficheros, ejecuto "make" y la compilaci�n se hace
correctamente, generando el archivo prov.so

El problema viene cuando intento importar la librer�a en Python:

Python 2.3.2 (#2, Oct  6 2003, 08:02:06) 
[GCC 3.3.2 20030908 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import prov
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ImportError: dynamic module does not define init function (initprov)


Gracias por vuestra atenci�n.


-- 
Scero.

Jose Luis Nogueira Alonso.

http://scero.homelinux.org

GPG disponible en wwwkeys.pgp.net

Responder a