Como salvar objects ctypes contendo pointers

Eu uso uma biblioteca de terceiros que retorna após muita computação um object ctypes contendo pointers.

Como posso salvar o object ctypes e o que os pointers estão apontando para uso posterior? eu tentei

  • scipy.io.savemat => TypeError: Não foi possível converter o object em array
  • cPickle => objects ctypes contendo pointers não podem ser decapados

O Python não tem como fazer isso automaticamente para você:

Você terá que criar código para escolher todos os Dados desejados, colocando-os em uma estrutura de dados Python adequada (ou apenas adicionando os dados em uma cadeia de bytes única onde você saberá onde cada elemento está por seu deslocamento) – e então salvar esse object para o disco.

Este não é um problema “Python” – é exatamente um problema que o Python resolve quando você usa objects e dados do Python. Ao codificar em C ou nível inferior, você é responsável por saber não apenas onde estão seus dados, mas também o tamanho de cada bloco de dados (e alocar memory para cada pedaço, e liberá-lo quando feito, e etc). E isso é o que você tem que fazer neste caso.

Sua estrutura de dados deve fornecer não apenas os pointers, mas também o tamanho dos dados em cada local apontado (de uma forma ou de outra – se o ponteiro for para outra estrutura, “size_of” funcionará para você)

Você pode copiar os dados em uma estrutura de dados Python e desreferenciar os pointers à medida que você for (usando o atributo de contents de um ponteiro).

Para conservar um object ctypes que tenha pointers, você teria que definir seus próprios methods __reduce__ / __reduce__ para decapagem e __setstate__ para desparafinar. Mais informações nos documentos para o módulo pickle.