2015-03-15 20 views
6

Historia: Próbuję interfejs z C do Pythona, aby użyć szybszej prędkości obliczeniowej C dla istniejącego kodu Pythona. Osiągnąłem już pewien sukces, także z przekazywaniem tablic NumPy - ale teraz wydaje się, że jest problem i nie mogę go rozwiązać. Jest to kod:Python - SystemError: NULL wynik bez błędu w wywołaniu PyObject

#define FORMAT_VALUE_T "d" 
char format_buffer[32]; 

typedef struct 
    { 
     PyObject_HEAD 
     PyArrayObject *invmat; 
     unsigned order; 
     value_t weight, *buffer; 
    } Det; 

    typedef double value_t; 

    typedef struct 
    { 
     PyObject_HEAD 
     Det *det; 
     value_t *row, *covs, ratio, star; 
    } DetAppendMove; 

    static int append_init(DetAppendMove *self, PyObject *args, PyObject *kwds) 
    { 
     value_t star, *temp; 
     PyArrayObject *row, *col; 
     PyObject *result = Py_BuildValue("(i)",1); 
     Det *dete; 

     snprintf(format_buffer, sizeof(format_buffer), "%s%s", "O!O!O!", FORMAT_VALUE_T); 
     if (PyArg_ParseTuple(args, format_buffer, &DetType, &dete, &PyArray_Type, &row, &PyArray_Type, &col, &star)) 
     { 
      self->det = dete; 
      temp = (value_t*)self->det->buffer; 
     } 
     else 
     { 
      result = Py_BuildValue("(i)",-1); 
     } 
     return result; 
    } 

to naprawdę nie robi nic by teraz, po prostu chciałem sprawdzić, czy jestem w stanie przekazać te arrays.As tytuł mówi, ja otrzymuję następujący komunikat o błędzie:

SystemError: NULL result without error in PyObject call

Jest to interesujące, ponieważ już zdałem kilka tablic jeden raz (zrobiłem to w ten sam sposób ..) i zwykle te tablice są może 100x100, nawet jeśli. Zazwyczaj ludzie narzekali na bardzo dużych tablic ..

Używam Ubuntu 14.04 na komputerze 64-bitowym, Python V2.7.6 i NumPy 1.8.2

Byłoby świetnie, gdyby ktoś z was może mi pomóc - ja nie mam pojęcia, co poszło nie tak ..

EDYCJA: Jeszcze nie wymyśliłem problemu, ale czasami działa, czasami zawiesza się z powodu błędu z góry .. Nie mam absolutnie pojęcia, co to może być - kogokolwiek?

+2

Gdzie zdefiniowano 'result'? – alk

+0

Również 'format_buffer' jest niezdefiniowany. I wiem, że zdefiniowanie 'FORMAT_VALUE_T' również byłoby miłe. – alk

+0

Przepraszam, musiałem przypadkowo usunąć niektóre rzeczy. Teraz powinno być ok. – rammelmueller

Odpowiedz

1

Niedawno ktoś pokazał mi odpowiedź w innym poście:

When you return NULL from a c function exposed to python you must set the error message before, since returning NULL means an error happened.

If an error happened and you are returning NULL because of that then, use PyErr_SetString(), if no error happened, then use

Py_RETURN_NONE; 

Thanks iharob, pomogło!

L.