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: