Доступ к содержимому PyBuffer из C - PullRequest
2 голосов
/ 24 января 2010

Я создал буферный объект в 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 ]

2 голосов
/ 04 февраля 2010

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

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

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

1 голос
/ 25 января 2010

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

...