dépendances du module Cross dans Boost Python
-
09-10-2019 - |
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
.