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 :
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 BOOST_PYTHON_MODULE(MyModule) { class_<MyObject>("MyObject")... }
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
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(); }
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++.
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(); }
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 ?
Partager