Ho difficoltà a generare un wrapper Python attorno a una libreria C++ utilizzando SWIG (versione 3.0.6).Come applicare i typemaps di SWIG OUTPUT per i tipi di classe in Python?
Il mio problema si riferisce all'applicazione del typemap OUTPUT, in particolare nel caso di puntatori/riferimenti a tipi di classi.
Per illustrare, questo è quello che voglio per i tipi standard, e funziona:
// .h
int add(const long arg1,const long arg2,long& resultLong);
// interface.i
%apply long& OUTPUT { long& resultLong };
int add(const long arg1,const long arg2,long& resultLong);
// projectWrapper.py
def add(arg1, arg2):
return _projectWrapper.add(arg1, arg2)
addTerm = _projectWrapper.add
// usage
>>> result = projectWrapper.add(2, 4)
>>> print result
[0, 6L]
Non è necessario passare in "resultLong", ma viene aggiunto al risultato automaticamente. Grande!
Tuttavia, questo non sembra funzionare come mi aspetto quando il tipo di uscita è un po 'di puntatore a un tipo di classe:
// .h
int GetClassType(const char* name, exportedClassType*& resultPointer);
class exportedClassType
{...}
// interface.i
%apply exportedClassType*& OUTPUT { exportedClassType*& resultPointer };
int GetClassType(const char* name, exportedClassType*& resultPointer);
// projectWrapper.py
def GetClassType(name, resultPointer):
return _projectWrapper.GetClassType(name, resultPointer)
GetClassType = _projectWrapper.GetClassType
Il problema sembra essere che SWIG non ha elaborato nella stessa come il tipo semplice. Appare ancora come un parametro "input" nella firma della funzione avvolta.
// attempted usage
>>> classType = projectWrapper.GetClassType("name")
TypeError: GetClassType() takes exactly 2 arguments (1 given)
>>> result = 0
>>> projectWrapper.GetClassType("name", result)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: in method 'GetClassType', argument 2 of type 'exportedClassType *&'
Qualcuno può dirmi che cosa sto sbagliando o indicarmi la direzione giusta? Qualsiasi aiuto ricevuto con gratitudine! Grazie
Hai provato a usare un doppio puntatore? Ho avuto problemi con i doppi puntatori e il codice generato utilizzando SWIG 2.0.7, ma questo è risolto in 3.X.X –
Grazie per la risposta. Scusa, come apparirebbe nel file interface.i? – SWilliams
Devo dire che non possiedo il C++ e non posso cambiare le firme dei metodi lì. Ho sicuramente bisogno di gestire un metodo prendendo un parametro 'exportedClassType * &'. – SWilliams