Copie d'un objet C++ étendu avec Python
Bonjour,
je rencontre un petit problème dans mes tentatives d'interfaçage entre C++ et Python avec Boost.Python .
Imaginons que j'ai un simple objet C++. Il est exposé à Python comme on le fait habituellement avec Boost.python :
Code:
1 2 3 4 5
|
BOOST_PYTHON_MODULE(MyModule)
{
class_<MyObject>("MyObject")...
} |
J'appelle ensuite un code python, en rendant une instance de cet objet accessible :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
MyObject anInstance;
object main_module((handle<>( borrowed( PyImport_AddModule( "__main__" ) ) ) ) );
object main_namespace = main_module.attr( "__dict__" );
object myModule( (handle<>(PyImport_ImportModule("MyModule"))) );
main_namespace["anInstance"] = ptr(&anInstance);
try
{
handle<> ignored(( PyRun_String( "anInstance.aNewMember = 1;print anInstance.aNewMember;",
Py_file_input,
main_namespace.ptr(),
main_namespace.ptr() ) ) );
}
catch ( error_already_set )
{
PyErr_Print();
} |
J'ai dans le code Python rajouté un membre ( aNewMember ) à l'instance de mon objet. Pratique. Mon problème est que si je fais une copie de mon objet :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
MyObject anotherInstance = anInstance;
main_namespace["anotherInstance"] = ptr(&anotherInstance);
try
{
handle<> ignored(( PyRun_String( "print anotherInstance.aNewMember;",
Py_file_input,
main_namespace.ptr(),
main_namespace.ptr() ) ) );
}
catch ( error_already_set )
{
PyErr_Print();
} |
Seulement là, j'ai le droit à un message d'erreur de Python qui me dit que MyObject n'a pas de aNewMember. Les rajouts que j'ai fait en Python n'ont pas été copié lors de la copie en C++.
C'est embêtant si je veux étendre un objet qui est dans un vector, vu qu'il sera sujet à des copies lorsque je manipulerais le vector. Auriez vous un moyen de contourner ce problème ?