[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Pregunta sobre Python y C



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



Reply to: