Question

Supposons que j'ai deux modules de python de suralimentation qui sont définis comme suit. Module A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    class_<SomeClass>("SomeClass");
}

Et le module B:

class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

Module B a une dépendance sur le module A (à savoir, il utilise SomeClass du module A). Maintenant, j'exécuter le script python suivant:

import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)

je reçois l'erreur suivante:

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)

Il semble que Python ne se traduit pas automatiquement des classes entre les modules. Est-ce que quelqu'un a une idée de comment résoudre ce problème?

Pas de solution correcte

Autres conseils

Je viens récemment commencé à jongler avec Boost.Python et a eu le même problème.

Consultez la section 6 du document suivant:

http://www.boost.org/doc/libs/1_47_0 /libs/python/doc/building.html

6.1 - Le binaire dynamique

La bibliothèque contient un registre de conversion de type. Parce qu'un registre est partagée entre tous les modules d'extension, instances d'une classe exposée à python dans un module d'extension chargées dynamiquement peuvent être transmises à des fonctions exposées dans un autre tel module .

J'utilisais le binaire statique et a obtenu le même type d'erreur que vous obtenez. Une fois que je l'ai changé le binaire dynamique, il a compilé et RAN bien.

Selon votre dernière réponse et un message d'erreur mis à jour dans votre question, je pense que le problème est peut-être parce que votre utilisation de BOOST_PYTHON_MODULE peut être incorrect (basé sur ce que j'ai vu dans d'autres exemples de son utilisation). Essayez quelque chose comme ça et voir si elle aide à:

Module A:

class SomeClass {
public:
    SomeClass() {}
    ~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{   
    boost::python::class_<SomeClass>("SomeClass");
}

Et le module B:

class AnotherClass {
public:
    AnotherClass() {}
    ~AnotherClass() {}
    void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{   boost::python::class_<AnotherClass>("AnotherClass")
        .def("func", &AnotherClass::func)
    ;
}

Notez l'insertion d'un préfixe « boost::python:: » sur la déclaration de class_<...> dans chacune des deux déclarations de BOOST_PYTHON_MODULE.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top