У меня есть библиотека, написанная на cython, которая обертывает библиотеку C, и я показываю несколько строк c в коде Python . Эти строки большие и статические (не могут их освободить), поэтому просто сделать из них строку python (которая делает копию) не вариант - я получаю ошибки OOM.
У меня есть код, работающий для python 2. x в настоящее время использует старый буферный API, который выглядит примерно так:
def get_foo():
return PyBuffer_FromMemory(c_foo_ptr,c_foo_len)
Это просто работает (tm) для python 2.x, но старый буферный API отсутствует в 3.x, и я не могу понять, как это сделать Я получаю это с новым.
Я вижу это там » s PyMemoryView_FromBuffer и PyBuffer_FillInfo , которые вместе предположительно будут делать то же самое, но PyBuffer_FillInfo хочет объект, который не существует для меня (это просто уровень модуля функция), создание фиктивного объекта и передача его просто дает мне segfault, поэтому я предполагаю, что этот объект должен каким-то образом поддерживать буфер ... но где это задокументировано?
дальше от экспериментов с видами памяти, которые они не выглядят и не действуют как строки (или байты) вообще, так что мне придется либо переписать весь мой код Python, либо каким-то образом воссоздать эту функциональность.
Я что-то упускаю? есть ли простой способ заменить PyBuffer_FromMemory в py3k?
Примечание: я использую cython, но это необработанный материал c-api, поэтому вы можете отвечать, не вовлекая в него cython.