le dipendenze dei moduli di fondo in Boost Python
-
09-10-2019 - |
Domanda
Supponiamo che io ho due moduli spinta python che sono definite come segue. Modulo A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
e il modulo B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
modulo B ha una dipendenza modulo A (cioè usa SomeClass
dal modulo A). Ora, eseguo il seguente script python:
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
ottengo il seguente errore:
Traceback (most recent call last):
File "C:\bladiebla\script.py", line 8, in <module>
obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)
Sembra che Python non si traduce automaticamente le classi tra i moduli. Qualcuno ha un'idea di come risolvere questo?
Nessuna soluzione corretta
Altri suggerimenti
Ho da poco iniziato a giocherellare con Boost.Python e aveva lo stesso problema.
Scopri la sezione 6 del seguente documento:
http://www.boost.org/doc/libs/1_47_0 /libs/python/doc/building.html
6.1 - La dinamica Binary
La biblioteca contiene un registro tipo di conversione. Perché un registro è condivisa tra tutti i moduli di estensione, istanze di una classe esposto a Python in un modulo di estensione dinamicamente loaded possono essere passati a funzioni esposte in un altro tale modulo .
Stavo usando il binario statico e ottenuto lo stesso tipo di errore si stavano diventando. Una volta ho cambiato il binario dinamico, compilato e ha funzionato benissimo.
In base alla tua ultima risposta e messaggio di errore aggiornato nella tua domanda, penso che il problema potrebbe essere dovuto al fatto che l'uso BOOST_PYTHON_MODULE
potrebbe non essere corretto (in base a quello che ho visto in altri esempi di utilizzo). Provare qualcosa di simile e vedere se aiuta:
Modulo A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
boost::python::class_<SomeClass>("SomeClass");
}
e il modulo B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ boost::python::class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Si noti l'inserimento di un prefisso "boost::python::
" sulla dichiarazione class_<...>
in ciascuna delle due dichiarazioni BOOST_PYTHON_MODULE
.