IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[C++ et Python] Passer un objet par r�f�rence � un script Python


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par d�faut [C++ et Python] Passer un objet par r�f�rence � un script Python
    Bien le bonjour !

    J'ai un petit probl�me. Je bosse sur l'utilisation de l'interpr�teur Python dans un programme C++ et je souhaite passer une instance d'un objet C++ � un script Python pour l'utiliser et le modifier dans ce dernier.

    Je n'utilise que l'API C de Python et j'avoue ne pas y parvenir. J'ai ou�e dire � droite � gauche qu'une solution existait avec SWIG mais apr�s avoir regard� de plus pr�s je ne suis pas sur que SWIG puisse r�ellement r�soudre ce probl�me.

    Si quelqu'un connait une m�thode efficace avec l'API C de Python ou peut me renseigner plus pr�cis�ment sur SWIG, ce serait super.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 38
    Par d�faut
    Salut BigzYeah,

    J'ai fait du SWIG dans mon projet actuel parce que je devais wrapper du code C++ en Python pour l'utiliser dans les deux langages.

    Et il m'a servi � r�soudre mon probl�me de r�f�rences, car Python ne g�re que les pointeurs. Il m'a suffit de faire des typemap pour faire la correspondance entre les langages.

    Si �a c'est ce que tu veux, tu peux peut-�tre poster un exemple de ce que tu essaies de faire, et on pourra essayer d'utiliser SWIG pour r�soudre ton souci

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par d�faut
    Fort bien, merci de ton aide =)

    Dans un premier temps, prenons un exemple simple de ce que je souhaite.

    D'un c�t� nous avons l'application C++ qui va se charger d'appeler une m�thode contenu dans un script Python. Lors de cette appel, le programme C++ va donner en param�tre une instance d'une cha�ne de caract�re.

    De la sorte :

    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
    20
    21
     
    Py_Initialize();
     
    PyObject *pName, *pModule, *pFunc;
    PyObject *pArgs, *pValue;
     
    String maStringCPP = "Je suis une string super cool !"
     
    pName = PyString_FromString("module"); 
    pModule = PyImport_Import(pName);
     
    pFunc = PyObject_GetAttrString(pModule, "modifier");
     
    pArgs = PyTuple_New(1);
    pValue = PyString_FromString(maStringCPP);
    PyTuple_SetItem(pArgs, 0, pValue);
     
    // Ici on appel la méthode modifier en donnant en paramète la string
    PyObject_CallObject(pFunc, pArgs);
     
    Py_Finalize();
    Dans le script Python, il y aura donc une m�thode modifier() qui prendra en param�tre une string et qui la modifiera, de la sorte :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    def modifier(maStringPython):
        maStringPython = "String modifiée"
    Le but recherch� �tant que la modification de la cha�ne faite dans le script Python modifie la valeur de la cha�ne se trouvant dans le programme C++.

    Le pr�sent code ne fonctionne bien �videmment pas. Ici la string C++ est transform�e en string python. Ces objets �tant imutables en Python, la modification de maStringPython n'influe en rien sur maStringCPP. Pour parer � ce probl�me d'imutabilti�, j'ai essay� d'utiliser une liste mais une exception est lev�e lors de l'appel de la m�thode.

    Ce que je cherche est en soit assez simple. Je veux pouvoir passer maStringCPP au script Python soit par r�f�rence, soit comme pointeur pour pouvoir travailler sur l'objet et non sa valeur.

    La finalit� �tant d'utiliser ce principe pour passer un objet bien plus complexe qu'une string.

  4. #4
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Bonsoir,

    Pour SWIG, je te conseille de lire la documentation. Ca fait un peu peur, vu la taille, mais c'est pas mal organis�.

    http://www.swig.org/Doc1.3/Python.html

    Grosso merdo, le principe et le suivant :

    Tu as tes codes en C/C++ (les headers surtout), tu �cris un fichier d'interface (.i) qui reprend les informations des headers (.h) auxquelles tu ajoutes des instructions (du style : ce pointeur en retour c'est un new; ou la classe est virtuelle pure, etc...)

    A partir de ce .i, swig g�n�re un wrapper (un fichier .cpp) qui permettra de g�n�rer ton module.

    swig [-c++] -python mon_module.i

    Ensuite, tu compiles le wrapper en temps que biblioth�que partag�e en le liant � ta biblioth�que et � celle de python, tu renommes le r�sultat en _mon_module.pyd et hop, tu peux l'importer.

    http://www.swig.org/Doc1.3/Python.html#Python_nn10


    Un point particuli�rement int�ressant r�side dans le fait que la stl est d�j� d�crite de sorte que SWIG g�n�re le wrapper pour les std::string, les std::vector, etc...

    http://www.swig.org/Doc1.3/Python.html#Python_nn52

    Perso, j'avoue que cet outil m'impressionne


    Bonne continuation,

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Par d�faut
    Merci de ces explications. N�anmoins, elles me laissent penser que SWIG ne permet qu'un extending de Python plut�t qu'un embedding dans du c++.

    Du moins, de ce que je comprend, SWIG est parfaitement adapt� pour qu'un script Python se serve de m�thodes C++, mais est il possible de faire l'inverse ?

  6. #6
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Citation Envoy� par BigzYeah Voir le message
    Merci de ces explications. N�anmoins, elles me laissent penser que SWIG ne permet qu'un extending de Python plut�t qu'un embedding dans du c++.
    Tu penses juste, dans l'autre sens je ne connais pas d'outils � part l'api de bas niveau.

    Je n'ai pas encore eu � le faire, du coup, je te conseille de googleliser "embedding python in c++"

    Bonne continuation

Discussions similaires

  1. R�ponses: 2
    Dernier message: 14/01/2011, 09h42
  2. [POO] Modifier attributs d'un objet par r�f�rence
    Par justSam dans le forum Langage
    R�ponses: 8
    Dernier message: 22/02/2007, 07h58
  3. [debutant]passer un objet par const reference
    Par Battosaiii dans le forum D�buter
    R�ponses: 6
    Dernier message: 12/11/2005, 14h39
  4. retour d'objet par r�f�rence...
    Par sas dans le forum C++
    R�ponses: 15
    Dernier message: 28/05/2005, 17h54
  5. R�ponses: 4
    Dernier message: 21/03/2005, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo