Как сохранить переменную Cython? - PullRequest
0 голосов
/ 20 марта 2012

У меня есть строка байтов, которая передается в метод cython, и мне нужно передать ее в функцию c:

def stuff(bytes b):
    #b is b'something'
    some_c_function(b, len(b))

Указатель, который я передал, сохраняется в некоторой структуре внутри C-land. К тому времени, когда он используется, b исчезает, поэтому я получаю ошибку сегментации. Как мне сохранить его вне функции?

Я пробовал что-то вроде этого:

from libc.stdlib import malloc, memcpy

def stuff(bytes b):
    cdef char *data
    data_len = len(b)
    data = malloc(data_len)
    memcpy(data, b, data_len)
    some_c_function(data, data_len)

Но я получаю сообщение об ошибке malloc: Obtaining char * from temporary Python value.

1 Ответ

1 голос
/ 20 марта 2012
  1. Вам необходимо cimport функция malloc, в противном случае Cython обрабатывает импорт как импорт Python по умолчанию и считает, что malloc - это обычная функция Python.

  2. data_len должно быть len(b) + 1, а последний байт должен быть установлен на 0, т.е.
    data[data_len - 1] = 0. Это способ завершения строки в C / C ++.

  3. После того, как вы cimport -ed malloc и Cython рассматриваете функцию как функцию C, вам нужно будет выполнить приведение, в противном случае компилятор Cython будет жаловаться.

    data = <char*> malloc(data_len)

  4. Что у вас есть malloc -ед, должно быть освобождено самостоятельно . Убедитесь, что это произойдет.

...