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
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 ... –
"défait l'idée" - quelle est la valeur réelle de cette idée? (question honnête) – sehe
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). –