c++ python c segmentation-fault ctypes

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:

http://cffi.readthedocs.org/en/latest/index.html

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!