c++ - boost python
Python Ctypes Crashes Calling C wrapper de la funciĆ³n C++ (1)
Hay una nueva biblioteca para interactuar con C, puede que lo mires:
Estoy tratando de usar Python Ctypes para interactuar con una biblioteca C ++ publicada (fuente cerrada). Yo (intenté) escribí un contenedor de funciones de estilo C básico para construir los objetos de estilo vector C ++ y llamar a la rutina C ++. También (intenté) escribí un script básico de python para cargar la biblioteca compartida. Todo funciona, excepto la línea que llama a la rutina C ++ que produce:
*** glibc detected *** python: free(): invalid next size (fast): 0x0000000001e73c00 ***
Estos son los archivos, desafortunadamente no puedo compartir los encabezados, pero puedo escribir algo similar si es necesario ...
gaumixmod.cpp:
#include "nr3.h"
#include "cholesky.h"
#include "gaumixmod.h"
extern "C" {
void cGaumixmod(double* D, int Dm, int Dn, double* M, int Mm, int Mn) {
MatDoub ddata(Dm,Dn,*D); // construct Matrix (vector) type
MatDoub mmeans(Mm,Mn,*M); // construct Matrix (vector) type
//XXX test numpy array is coming through as C array and we can rw, checks OK
int i;
// for(i=0;i<Dn*Dm;++i) {
// printf("Address %x : ",(D+i));
// printf("was %f /t" , D[i]);
// D[i]+=1.0;
// printf("now: %f /n" , D[i]);
// }
// check that array D was copied to matrix ddata, and we can r/w
for(i=0;i<Dm*Dn;++i) {
printf("iter %d Address %x : ",i,ddata[i/Dm][i%Dm]);
printf("was %f /t" , ddata[i/Dm][i%Dm]);
ddata[i/Dm][i%Dm]+=1.0;
printf("now: %f /n" ,ddata[i/Dm][i%Dm]);
}
Gaumixmod::Gaumixmod(ddata,mmeans);
//return data from vector to ctypes array C so we can check data returns to python
//via numpy array, checks ok
for(i=0;i<Dm*Dn;++i) {
D[i] = ddata[i/Dm][i%Dm];
}
}
}
goumixmod.py:
import platform,ctypes
import numpy as np
# ------------------------------------------------------------------------
# define correct library from platfrom, assuming 64bit for linux machines
# ------------------------------------------------------------------------
if platform.system()==''Microsoft'':
raise Exception(''MS not supported.'')
elif platform.system()==''Darwin'':
libgaumixmod = ctypes.cdll.LoadLibrary("./gaumixmod.so")
elif platform.system()==''Linux'':
libgaumixmod = ctypes.cdll.LoadLibrary("./gaumixmod.so")
else:
#hope for the best
libgaumixmod = ctypes.cdll.LoadLibrary("./gaumixmod.so")
# --------------------------------------------------
# define SafeCall
#---------------------------------------------------
def SafeCall(ret):
"""pass, code l8r""
print ret
#---------------------------------------------------
# define arg types and res types of function
# -----------------------------------------------------------------------
_gaumixmod = libgaumixmod.cGaumixmod
_gaumixmod.restype = ctypes.c_int
_gaumixmod.argtypes = [np.ctypeslib.ndpointer(dtype=np.float64,flags=''C_CONTIGUOUS''),
ctypes.c_int,
ctypes.c_int,
np.ctypeslib.ndpointer(dtype=np.float64,flags=''C_CONTIGUOUS''),
ctypes.c_int,
ctypes.c_int]
def gaumixmod(D,K):
"""Python binding for C++ guassian mixure model code."""
ret = _gaumixmod(D,D.shape[0],D.shape[1],K,K.shape[0],K.shape[1])
SafeCall(ret)
return D,K
D = np.ones((100,100)).astype(np.float64)
K = np.ones((4,1)).astype(np.float64)
print gaumixmod(D,K)
y compilo este jazz con:
g++ -fPIC -c gaumixmod.cpp;
g++ -shared -o gaumixmod.so gaumixmod.o
y correr
python gaumixmod.py
Mi investigación indica que este error es algo similar a un segFault, donde python está tratando de alcanzar una memoria fuera de su alcance ... Esta es la parte que no entiendo porque al comentar la línea C ++ Gaumixmod :: Gaumixmod (), todo funciona bien, y esa rutina debería estar operando en los vectores instanciados en la función cGaumixmod (), no en las matrices nude de python. Realmente no estoy familiarizado con C ++, aunque he usado C tipos muchas veces para las bibliotecas C. Espero que alguien con algo de experiencia en C ++, python y ctypes pueda dar alguna información / orientación aquí.
¡Gracias!