python c-api: создание байтов с использованием существующего буфера без копирования

#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. Не могли бы вы объяснить, как это можно сделать, желательно с примером кода?