Самый простой способ получить wchar*
от объекта Unicode - это, вероятно, PyUnicode_AsWideCharString
.Cython не предоставляет определения, поэтому вам нужно сделать подходящее cdef extern
самостоятельно:
from libc.stddef cimport wchar_t
from cpython.mem cimport PyMem_Free
cdef extern from "Python.h":
wchat_t* PyUnicode_AsWideCharString(object, Py_ssize_t*) except NULL
def f(string):
cdef wchar_t* c_string = PyUnicode_AsWideCharString(string, NULL)
# use the string
PyMem_Free(<void*>c_string) # you must free it after use
Прочтите документацию, чтобы узнать, следует ли использовать аргумент "size".
Длявыделить место для массива wchar_t*
, вы должны использовать malloc
или calloc
.Вы должны free
это место, когда вы закончите с этим.Вам нужно привести из malloc
from libc.stdlib cimport malloc, free
cdef wchar_t** strings = <wchar_t**>malloc(sizeof(wchar_t*)*length)
# do something
free(<void*>strings)
Обычный шаблон из проверки очистки памяти для использования try и finally:
def some_py_func(py_list):
g_symbols = malloc(...)
try:
# loop through py_list getting wchar_t*
# call your C function
finally:
# loop through g_symbols calling PyMem_Free
free(g_symbols)
Вам нужно быть осторожным, чтобы вы только вызывалиPyMem_Free
на действительные (или NULL
) указатели в случае исключения.Помните, что память из malloc
может быть заполнена произвольными значениями, которые небезопасно передавать в PyMem_Free
.