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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top