2015-03-15 11 views
6

Câu chuyện: Tôi đang cố gắng để giao tiếp từ C đến Python để sử dụng tốc độ tính toán nhanh hơn của C cho một mã Python hiện có. Tôi đã có một số thành công, cũng với việc truyền các mảng NumPy - nhưng bây giờ có vẻ như là một vấn đề và tôi không thể giải quyết nó. Đây là mã:Python - SystemError: Kết quả NULL mà không có lỗi trong PyObject gọi

#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; 
    } 

Nó không thực sự làm bất cứ điều gì bởi bây giờ, tôi chỉ muốn kiểm tra xem tôi có thể vượt qua những arrays.As tiêu đề nói, tôi nhận được thông báo lỗi sau:

SystemError: NULL result without error in PyObject call

Điều này thật thú vị, vì tôi đã chuyển một số mảng một lần (giống như vậy ..) và thường những mảng này có thể là 100x100 nếu ngay cả. Thường thì mọi người phàn nàn về mảng rất lớn ..

Tôi đang sử dụng Ubuntu 14.04 trên một máy 64Bit, Python V2.7.6 và NumPy 1.8.2

Nó sẽ là tuyệt vời nếu một trong hai người có thể giúp tôi - tôi không có ý tưởng gì đã xảy ra ở đây ..

CHỈNH SỬA: Tôi chưa tìm ra vấn đề, nhưng đôi khi nó hoạt động, đôi khi nó gặp sự cố từ trên .. Tôi hoàn toàn không biết điều này có thể là gì - có ai không?

+2

'Kết quả' được định nghĩa ở đâu? – alk

+0

Ngoài ra 'format_buffer' là không xác định. Và biết cách 'FORMAT_VALUE_T' được định nghĩa cũng sẽ tốt đẹp. – alk

+0

xin lỗi, phải vô tình xóa một số nội dung. Nó sẽ ổn thôi. – rammelmueller

Trả lời

1

Gần đây có người chỉ cho tôi câu trả lời trong bài khác:

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; 

Cảm ơn iharob, đã giúp rất nhiều!

L.

Các vấn đề liên quan