Je suis en train d'ajouter un rappel python à une bibliothèque C++ comme illustré:rappel Python avec SWIG enveloppé le type
template<typename T> void doCallback(shared_ptr<T> data) {
PyObject* pyfunc; //I have this already
PyObject* args = Py_BuildValue("(O)", data);
PyEval_CallObject(pyfunc,args);
}
Cela échoue parce que les données n'a pas connu rasade, et n'est pas un PyObject.
J'ai essayé d'utiliser:
swigData = SWIG_NewPointerObj((void*)data, NULL, 0);
Mais parce que son modèle, je ne sais pas vraiment ce qu'il faut utiliser pour le second paramètre. Même si je code dur le SWIGTYPE 'correct', il se sépare généralement sur PyEval_CallObject.
Mes questions sont les suivantes:
Quelle est la meilleure façon d'invoquer l'emballage de type rasade ? Je vais même dans la bonne direction ici? Les administrateurs ont l'air promettant d'implémenter un rappel , mais je n'ai pas pu trouver un exemple de de directeurs avec python.
Mise à jour: L'emballage approprié est généré obtenir. J'ai d'autres fonctions qui retournent shared_ptrs et peuvent les appeler correctement.
Merci pour votre mise à jour, mais je suppose que je suis confus. Pourquoi ne pas simplement passer vos données shared_ptr à votre fonction Python? Pourquoi avoir un doCallback() du tout? –
Ma bibliothèque enveloppe une bibliothèque C++ existante. doCallback() est simplement un gestionnaire que la lib sous-jacente appelle de temps en temps. Pour être clair: je n'appelle jamais doCallback() de Python. – rogueg
Ah, bien sûr! J'ai ajouté une nouvelle réponse qui pourrait mieux vous servir. –