Accès au contenu de PyBuffer de C
-
22-09-2019 - |
Question
I ai créé un objet de mémoire tampon en python comme ceci:
f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))
Je passe maintenant byte_stream
comme paramètre à une fonction C, par SWIG. J'ai un typemap pour convertir les données qui ressemble à ceci:
%typemap(in) unsigned char * byte_stream {
PyObject *buf = $input;
//some code to read the contents of buf
}
Je l'ai essayé quelques différents bug de choses ne peut pas arriver au contenu réel / valeur de mon byte_stream. Comment puis-je convertir ou accéder au contenu de mon byte_stream
en utilisant l'API C? Il existe de nombreuses méthodes pour convertir des données C à un tampon, mais aucun que je peux trouver pour aller dans l'autre sens.
Je l'ai essayé de regarder cet objet dans GCB mais ni, ou les valeurs qu'il contient mes Points de données.
(j'utilise des tampons parce que je veux éviter la surcharge de convertir les données en une chaîne lors de la lecture à partir du fichier) J'utilise Python 2.6 sous Linux.
- Merci Pavel
La solution
J'utilise des tampons parce que je veux éviter la surcharge de la conversion du données à une chaîne lors de la lecture de le fichier
Vous n'êtes pas quoi que ce soit évites. La chaîne est déjà construite par la méthode read()
. L'appel buffer()
construit juste un objet tampon supplémentaire pointant vers cette chaîne.
En ce qui concerne l'obtention à la mémoire pointée par l'objet tampon, essayez PyObject_AsReadBuffer()
. Voir aussi http://docs.python.org/c-api/objbuffer.html .
Autres conseils
Dès que vous utilisez la méthode read
sur votre objet fichier, les données seront converties en un objet str
; appelant la méthode buffer
ne convertit pas en un flux de toute nature. Si vous voulez éviter les frais généraux de la création de l'objet chaîne, vous pouvez simplement passer l'objet de fichier à votre code C et ensuite l'utiliser via son API C .