Доступ к содержимому PyBuffer из C

Я создал буферный объект в Python так:

f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))

Я сейчас прохожу byte_stream в качестве параметра для функции C, через SWIG. У меня есть карта типов для преобразования данных, которая выглядит следующим образом:

%typemap(in) unsigned char * byte_stream {
    PyObject *buf = $input;
    //some code to read the contents of buf
}

Я пробовал несколько разных вещей, которые ошибка не может получить к фактическому содержанию / значению моего byte_stream. Как я могу конвертировать или получить доступ к содержанию моего byte_stream используя C API? Есть много разных методов для преобразования данных C в буфер, но я не могу найти ни одного другого способа обхода. Я попытался посмотреть на этот объект в gcb, но ни он, ни значения, на которые он указывает, содержат мои данные.

(Я использую буферы, потому что я хочу избежать затрат на преобразование данных в строку при чтении их из файла). Я использую python 2.6 в Linux.

- Спасибо, Павел

2 ответа

Решение

Я использую буферы, потому что я хочу избежать затрат на преобразование данных в строку при чтении их из файла

Вы ничего не избегаете. Строка уже построена read() метод. призвание buffer() просто создает дополнительный буферный объект, указывающий на эту строку.

Что касается получения в памяти, на которую указывает объект буфера, попробуйте PyObject_AsReadBuffer(), Смотрите также http://docs.python.org/c-api/objbuffer.html.

Как только вы используете read метод в вашем файловом объекте, данные будут преобразованы в str объект; вызывая buffer Метод не преобразует его в поток любого вида. Если вы хотите избежать накладных расходов на создание строкового объекта, вы можете просто передать файловый объект в ваш C-код и затем использовать его через C API.

Другие вопросы по тегам