2017-09-12 1 views
3

J'utilise boost :: python pour exporter des fonctions C++ qui attendent un void*. Ils l'interprètent comme une mémoire brute (un tableau d'octets) en interne. Pensez read et write pour un appareil très spécial.Passer un tableau d'octets à une fonction C++ qui accepte un pointeur vide

Comment puis-je passer un Python bytearray à une telle fonction?

J'ai essayé d'utiliser ctypes.c_void_p.from_buffer(mybytearray) mais cela ne correspond pas à la signature de la fonction.

Voici l'exemple minimal:

#include <boost/python.hpp> 

void fun_voidp(void*) {} 

BOOST_PYTHON_MODULE(tryit) { 
    using namespace boost::python; 
    def("fun_voidp", fun_voidp); 
} 

Et du côté python:

import tryit 
import ctypes 
b = bytearray(100) 
tryit.fun_voidp(b) # fail 
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b)) # fail 
tryit.fun_voidp(ctypes.c_void_p.from_buffer(b).value) # fail 

Répondre

3

Je voudrais bien fixer le prototype de la fonction de prendre char* et aller avec la dernière ligne de python.

Il n'y a aucune raison d'utiliser void* en C++. Je comprends si l'API le fait, mais il ne devrait pas être difficile de l'emballer avec votre propre fonction.

+0

Il s'agit d'une API héritée utilisée par d'autres projets, il est impossible de la modifier et l'envelopper l'empêche de l'exporter telle quelle. Je pourrais envelopper dans une fonction qui accepte un objet python ... –

+0

"défait l'idée" - quelle est la valeur réelle de cette idée? (question honnête) – sehe

+0

Il y a beaucoup de telles fonctions et écrire un emballage pour chacun serait beaucoup de travail. Peut-être que je vais quand même aller sur cette route, pour rendre l'interface Python plus idiomatique (c'est-à-dire retourner un nouveau tableau d'octets au lieu d'en avoir un comme argument et de le remplir). J'aimerais quand même savoir s'il y a une option pour utiliser un tableau d'octets comme "void *" avec boost (on peut facilement le faire avec ctypes par exemple). –