dependencias de módulos transversales en Python Boost
-
09-10-2019 - |
Pregunta
Supongamos que tengo dos módulos impulso pitón que se definen de la siguiente manera. Módulo A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
Y el módulo B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Módulo B tiene una dependencia de módulo A (es decir, que utiliza SomeClass
de módulo A). Ahora, ejecute el siguiente script en Python:
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
Me sale el siguiente error:
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)
Parece que Python no se traduce automáticamente clases entre los módulos. ¿Alguien tiene una idea de cómo resolver esto?
No hay solución correcta
Otros consejos
Hace poco comenzó a tocar el violín con Boost.Python y tenía el mismo problema.
Compruebe la sección 6 del siguiente documento:
http://www.boost.org/doc/libs/1_47_0 /libs/python/doc/building.html
6.1 - La dinámica binaria
La biblioteca contiene un registro de conversión de tipos. Debido a un registro se comparte entre todos los módulos de extensión, instancias de una clase se expone a Python en un módulo de extensión dinámicamente cargado se puede pasar a las funciones expuestas en otro tal módulo .
Yo estaba usando el binario estático y tengo el mismo tipo de error que estaba recibiendo. Una vez que cambié al binario dinámico, que compila y funcionó muy bien.
En función de su respuesta más reciente y actualizada mensaje de error en su pregunta, creo que el problema podría ser debido a su uso de BOOST_PYTHON_MODULE
podría ser incorrecta (basado en lo que he visto en otros ejemplos de su uso). Pruebe algo como esto y ver si ayuda:
Módulo A:
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
boost::python::class_<SomeClass>("SomeClass");
}
Y el módulo B:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ boost::python::class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
Tenga en cuenta la inserción de un prefijo "boost::python::
" en la declaración class_<...>
en cada una de las dos declaraciones BOOST_PYTHON_MODULE
.