Acesse o conteúdo de pybuffer de C
-
22-09-2019 - |
Pergunta
Eu criei um objeto buffer em python como assim:
f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))
Agora estou passando byte_stream
como um parâmetro para uma função C, através do SWIG. Eu tenho um tipo de tipo de tipo para converter os dados que se parecem com o seguinte:
%typemap(in) unsigned char * byte_stream {
PyObject *buf = $input;
//some code to read the contents of buf
}
Eu tentei algumas coisas diferentes, o bug não pode chegar ao conteúdo/valor real do meu byte_stream. Como faço para converter ou acessar o conteúdo do meu byte_stream
usando a API C? Existem muitos métodos diferentes para converter dados C em um buffer, mas nenhum que eu possa encontrar para percorrer o contrário. Eu tentei olhar para esse objeto no GCB, mas nem ele, ou os valores que ele aponta para conter meus dados.
(Estou usando buffers porque quero evitar a sobrecarga de converter os dados em uma string ao lê -los no arquivo) Estou usando o Python 2.6 no Linux.
- Obrigado Pavel
Solução
Estou usando buffers porque quero evitar a sobrecarga de converter os dados em uma string ao lê -los no arquivo
Você não está evitando nada. A string já foi construída pelo read()
método. Chamando buffer()
Basta criar um objeto buffer adicional apontando para essa string.
Quanto a chegar à memória apontada pelo objeto buffer, tente PyObject_AsReadBuffer()
. Veja também http://docs.python.org/c-api/objbuffer.html.
Outras dicas
Assim que você usar o read
Método no seu objeto de arquivo, os dados serão convertidos para um str
objeto; chamando o buffer
O método não o converte em um fluxo de qualquer tipo. Se você deseja evitar a sobrecarga de criar o objeto String, você pode simplesmente passar o objeto de arquivo para o seu código C e depois usá -lo via sua API C..