#python-3.x #python-c-api #python-c-extension
#python-3.x #python-c-api #python-c-extension
Вопрос:
Мне кажется, что протокол буфера больше предназначен для передачи буфера Python в C.
Я не смог найти способ создать объект bytes с использованием существующего буфера без копирования в C.
По сути, я хочу реализовать что-то похожее на PyBytes_FromStringAndSize(), но без копирования и с обратным вызовом для освобождения буфера при освобождении объекта. Я не знаю, насколько велик буфер, прежде чем я получу буфер, возвращенный из C API. Поэтому сначала создать объект bytes в Python, а затем заполнить его — не вариант.
Я также заглянул в memoryview, PyMemoryView_FromMemory() не копирует, но нет способа передать обратный вызов для освобождения моего буфера. И я не уверен, что библиотека Python (например, Psycopg) может использовать объект memoryview или нет.
Должен ли я создавать свой собственный объект для выполнения этих 2 требований? Любой другой ярлык?
Если мне нужно, как я могу убедиться, что этот объект работает так же, как байты, чтобы я мог безопасно передать его в библиотеку Python?
Спасибо.
Ответ №1:
Единственный способ сделать это — создать новый объект с помощью PyBufferProcs* PyTypeObject.tp_as_buffer . Я тщательно проверил исходный код cpython, начиная с версии 3.4.1, нет готового (так сказать) решения.
Комментарии:
1. Не могли бы вы объяснить, как это можно сделать, желательно с примером кода?