Получить доступ к содержимому PyBuffer из C
-
22-09-2019 - |
Вопрос
Я создал объект buffer в python следующим образом:
f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))
Сейчас я прохожу мимо. byte_stream
в качестве параметра функции на языке Си, через 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.
-- Спасибо, Павел
Решение
Я использую буферы, потому что хочу избежать накладных расходов на преобразование данных в строку при чтении их из файла
Вы ничего не избегаете.Строка уже построена пользователем read()
способ.Зовущий buffer()
просто создает дополнительный объект buffer, указывающий на эту строку.
Что касается доступа к памяти, на которую указывает объект buffer, попробуйте PyObject_AsReadBuffer()
.Смотрите также http://docs.python.org/c-api/objbuffer.html.
Другие советы
Как только вы воспользуетесь read
метод на вашем файловом объекте, данные будут преобразованы в str
объект;вызывая buffer
метод не преобразует его в поток какого-либо вида.Если вы хотите избежать накладных расходов на создание объекта string, вы могли бы просто передать объект file в свой C-код, а затем использовать его через его C API.