PyObject_CallMethod muere al salir del metodo.

Maurizio Panniello maurix78 en wanadoo.es
Vie Oct 17 20:02:07 CEST 2003


Hola a todos,
Es la primera vez que escrivo a la lista, así que encantado de conoceros 
a todos ;)) Me llamo Maurizio y escribo desde Tenerife.
Vamos al problema que tengo...
Estoy escriviendo una extencion en c y quieria llamar al metodo de un 
objeto desde c pero resulta que al
llamar la función PyObject_CallMethod esta funciona perfectamente, llama 
al metodo que  practicamente no hace nada pero al salir del metodo y 
retornar a c, independentemente de lo que retorna y si lo recojo o no en 
un PyObject; me da una Violación de segmento.
Estoy compilando en un Pentium III, Debian/woody estable python2.2 
usando las distutil.
Estoy usando numarray en python y en c y la gsl (gnu scientific library) 
desde c.
Todo el codigo es bastante largo escribo solo la parte que me parece 
importante

De algun lado (desde la gsl yo le paso el puntero) se llama esta 
funcion, el puntero self es el objeto que contiene el metodo que quiero 
llamar:

int fun_f (const gsl_vector* par,void *self, gsl_vector* f) {
   PyObject *tpar=PyTuple_New(par->size);
   PyObject *resid, *lob;
   PyArrayObject *aresid;
   size_t i;
   //Generamos una lista con los parametros:
   for (i=0; i<par->size; i++)
      PyTuple_SetItem(tpar, i , Py_BuildValue("d",par->data[i]) );
  
   //Llamamos al metodo _F(params):
   printf("?1");
   lob=PyObject_CallMethod((PyObject*)self, "_FF", "(O)", tpar);   
//<----------------------------Aquí falla!
   printf("?2"); // <----------- esto nunca lo alcanza!!!
   Py_DECREF(tpar);
...........


el metodo  _FF es:

def _FF(self,params) :
      
#self.residuals=params[0]*exp((self.xvals-params[1])/(-2*params[2]))-self.yvals
      print "aquí llego",params
      #self.residuals=ascontiguous(self.residuals)
      return None

Ahora no hace mas que escribir "aqui llego!" y la tupla, con los valores 
correctos y todo perfecto
pero cuando retorna, intenta volver al c y... poff: segmentation fault!

Le he dado mil vueltas pero no consigo solucionar el problema. ;((

Gracias por adelantado por la ayuda...

Bye




Más información sobre la lista de distribución Python-es