Passing Python-Funktionen zu SWIG umschlossenen C ++ - Code

Ich versuche, mit SWIG eine C ++ - Bibliothek für Python zu erstellen. Die Bibliothek verwendet häufig Rückruffunktionen, indem sie @ übergib Rückruffunktionen eines bestimmten Typs zu Klassenmethoden.

Now, nachdem ich den Code eingepackt habe, möchte ich die Callback-Logik aus Python erstellen. Ist das möglich? Hier ist ein Experiment, das ich gemacht habe, um es herauszufinden. Funktioniert im Moment nicht.

Die Header- und Swig-Dateien lauten wie folgt:

paska.h:

typedef void (handleri)(int code, char* codename);

// handleri is now an alias to a function that eats int, string and returns void

void wannabe_handleri(int i, char* blah);

void handleri_eater(handleri* h);

paska.i:

%module paska

%{ // this section is copied in the front of the wrapper file
#define SWIG_FILE_WITH_INIT
#include "paska.h"
%}

// from now on, what are we going to wrap ..

%inline %{
// helper functions here

void wannabe_handleri(int i, char* blah) {
};

void handleri_eater(handleri* h) {
};

%}

%include "paska.h"

// in this case, we just put the actual .cpp code into the inline block ..

Schließlich teste ich in Python ..

import paska

def testfunc(i, st):
  print i
  print st

paska.handleri_eater(paska.wannabe_handleri(1,"eee")) # THIS WORKS!

paska.handleri_eater(testfunc) # THIS DOES NOT WORK!

Die letzte Zeile wirft mich auf "TypeError: in der Methode 'handleri_eater', Argument 1 vom Typ 'handleri *'"

Gibt es eine Möglichkeit, die Python-Funktion in einen vom SWIG-Wrapper akzeptierten Typ umzuwandeln?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage