Cython - преобразование списка строк в символ ** - PullRequest
6 голосов
/ 12 марта 2012

Как я могу преобразовать список Python строк Python в завершающий ноль char**, чтобы я мог передать его внешней функции C?

У меня есть:

struct saferun_task:
    saferun_jail   *jail
    saferun_limits *limits

    char **argv
    int stdin_fd  
    int stdout_fd
    int stderr_fd

int saferun_run(saferun_inst *inst, saferun_task *task, saferun_stat *stat)

в внешнем блоке cdef

Я хочу преобразовать что-то вроде ('./a.out', 'param1', 'param2') к чему-то, что я могу присвоить saferun_task.argv

Как?

1 Ответ

5 голосов
/ 10 июля 2012

Из документов Cython:

char* PyString_AsString (PyObject *string)

Возвращает нулевое представление содержимого строки.Указатель ссылается на внутренний буфер строки, а не на копию.Данные не должны быть изменены каким-либо образом.Он не должен быть выделен.

У меня нет настройки компилятора Cython и удобного atm (я могу запустить это позже и проверить), но это должно привести к коду, который выглядит примерно так:

from libc.stdlib cimport malloc, free

cdef char **string_buf = malloc(len(pystr_list) * sizeof(char*))

for i in range(len(pystr_list)):
    string_buf[i] = PyString_AsString(pystr_list[i])

# Do stuff with string_buf as a char**
# ...

free(string_buf)

Указатель stringBuf теперь является символом ** для ваших исходных данных без копирования каких-либо строк - хотя вам не следует редактировать данные в каждой строке, поскольку строки должны рассматриваться как const char * (из документов),Если вам нужно манипулировать строками, вам придется запоминать данные или создавать новые объекты, которые вас не волнуют в Python - хотя, поскольку у вас есть набор строк, я сомневаюсь, что вы их редактируете.

...