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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top