2010-01-24 9 views
2

Я создал объект буфера в Python, как так:Содержание доступа из PyBuffer из C

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

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

%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.

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^