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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?