[c++/Python] Passer une instance c++ à un script python

Passer une instance c++ à un script python [c++/Python] - C++ - Programmation

Marsh Posté le 27-09-2005 à 18:48:23    

Bonjour à tous,
 
Comme je ne sais pas ou poster je l'ai mis ici  :)  
 
J'essaie de passer une instance d'une classe C++ vers un script Python
J'ai définie la classe en python en utilisant Boost.
J'arrive à récupérer un ojbet de python, mais je n'arrive pas à envoyer un objet (instance) dans un script  
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. #include <boost/python.hpp>
  6. #include <graminit.h>
  7. using namespace boost::python;
  8. // Classe "Base" C++
  9. class Base
  10. {
  11. public:
  12. Base(int iPoids = 0) {_Poids = iPoids;};
  13.     ~Base() {};
  14.     int GetPoids() {return _Poids;};
  15. void SetPoids(int iPoids) {_Poids = iPoids;};
  16. private:
  17. int _Poids;
  18. };
  19. // Classe "Base" Python
  20. BOOST_PYTHON_MODULE(DIP)
  21. {
  22.    class_<Base>("Base", init<int>())
  23.         .def("GetPoids", &Base::GetPoids)
  24.  .def("SetPoids", &Base::SetPoids)
  25.     ;
  26. }
  27. string *readPythonScript( string fileName ); // fonction implémentée et qui marche, non explicité ici
  28. //-----------------------------------------------------------------------------
  29. // Name: main()
  30. // Desc: Application's main entry point.
  31. //-----------------------------------------------------------------------------
  32. void main( void )
  33. {
  34. Base Agent; // j'aimerais passer Agent dans le script
  35. if( PyImport_AppendInittab( "DIP", initDIP ) == -1 )
  36.  throw runtime_error( "Failed to add \"DIP\" to the "
  37.                       "interpreter's built-in modules" );
  38. // Setup Python to be embedded...
  39. Py_Initialize();
  40. object main_module(( handle<>(borrowed(PyImport_AddModule("__main__" )))));
  41. object main_namespace = main_module.attr("__dict__" );
  42. string *pythonScript = readPythonScript( "test.py" );
  43. if( pythonScript != NULL )
  44. {
  45.  PyRun_String( pythonScript->c_str(), Py_file_input,
  46.       main_namespace.ptr(), main_namespace.ptr() );
  47. }
  48. delete pythonScript;
  49. Agent = extract<Base&>(main_namespace["Agent"]); //Récup de l'instance agent du script dans l'objet C++
  50. cout << "Agent: " << Agent.GetPoids() << endl;
  51. // Cleanup after Python...
  52. Py_Finalize();
  53. system("pause" );
  54. }


 
et le script

Code :
  1. from DIP import *
  2. //Agent = Base(10) il faudrait récupérer l'instance Agent du c++
  3. Agent.SetPoids(15)


 
Quelqu'un connaitrait-il le contraire de "extract" ? (genre intract ou  insert  :??: )
 
Pitié j'ai besoin d'aide  :pt1cable:  
 
Merci d'avance

Reply

Marsh Posté le 27-09-2005 à 18:48:23   

Reply

Marsh Posté le 28-09-2005 à 11:21:02    

Re-bonjour,
 
J'ai peut-être mal expliqué mon problème. Le voici reformulé:
 
Je cherche en fait a rendre un objet c++ (ici, l'instance Agent créée au début du main) visible par un sript python pour qu'il puisse être modifié dans le script (par la ligne "Agent.SetPoids(15)" ).
La récupération de l'objet modifié dans le script python est ensuite récupéré dans le programme c++ pour continuer le traitement.
Actuellement, la récupération d'un objet python dans le programme c++ est effective. Ce qui me pose un probleme est de rendre visible l'objet Agent du programme c++ au script python.
Je ne sais pas du tout comment faire.
 
Si quelqu'un peut m'aider, j'en serais reconnaissant.
 
Merci d'avance

Reply

Marsh Posté le 30-09-2005 à 12:32:15    

Regarde par la, ca devrait t'aider:
http://www.swig.org/

Reply

Marsh Posté le 30-09-2005 à 15:09:31    

bonjour.
 
J'ai commencé de regarder swig, mais étant donné que j'utilise boost pour autre chose et que je souhaite garder une certaine unité dans mon code, j'aimerais savoir si quelqu'un a déjà scripté une partie de programme c++ en python à l'aide de la librairie boost. Si oui, un petit exemple serai le bienvenu.
Par contre, si tous le monde pense qu'il vaut mieux utiliser swig pour interfacer des scripts avec mon programme c++, je suis prêt à l'utiliser.
 
Merci pour les conseils que vous voudrez bien me donner.

Reply

Marsh Posté le 30-09-2005 à 18:35:47    

Si la documentation en ligne et la FAQ de boost.Python ne répondent pas à cette question,  
peut-etre pourrais-tu poser ta question sur la mailing list utilisateur de boost python ?
Apparemment, la liste python c++-sig semble approprié (anglophone).
 
http://www.boost.org/more/mailing_lists.htm#users
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed