Отображение строки C без копирования в код python 3.x

У меня есть библиотека, написанная на 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.

7
задан Lennart Regebro 16 February 2011 в 12:11
поделиться