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++

  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

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155

  8. #8
    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
    H�las j'ai comme contrainte de ne pas utiliser Boost Python :/

    Je suis convaincu qu'il est possible de le faire avec l'API C de Python mais la d�marche m'est encore inconnue.

    J'ai pourtant fait une dose de recherche assez monstrueuse sur le net mais semble t'il que peu de personnes utilise l'API C. A par la documentation, qui est pourtant tr�s compl�te, il y a pas grand chose d'autre.

    EDIT : Si aucune autre options m'est disponible, je vais essayer de faire du forcing aupr�s de mon chef de projet pour utiliser Boost. Dans ce cas j'aimerais savoir comment se passe le passage d'instance depuis l'appli C++ jusqu'au script Python. Peut on envoyer un pointeur ? Ou peut on faire un passage par r�f�rence ? Y a t'il une conversion entre objet C++ et objet Python � faire manuellement ou Boost se charge de tout ?

  9. #9
    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
    Petit compl�ment d'information.

    Les objets que je souhaite manipuler entre mon appli C++ et mon script Python sont des objets COM. Plus particuli�rement des contr�les ActiveX. Ces contr�les ne seront pas �crit par moi, impossible donc de se baser sur un wrapping de ces objets. A premi�re vu, il semble donc impossible de transformer une instance d'un contr�le activeX en objet Python puisque ces contr�les seront une sorte de type inconnu.

    N�anmoins certains choses sont possibles. Cr�er une instance d'un contr�le dans l'appli C++ � partir de son CLSID (un truc qui ressemble � �a : {232E456A-87C3-11D1-8BE3-0000F8754DA1}).
    Il m'est aussi possible de cr�er un instance de ce contr�le dans mon script Python, � l'aide du module comtypes.

    Le soucis �tant que je veux le cr�er dans le C++ et le modifier dans le script Python. C'est donc ce seul transfert de donn�e qui m'est important. Est-ce possible de passer au script l'adresse m�moire de l'instance C++ pour l'utiliser dans le script ? J'en doute un peu.

    Si quelqu'un a la moindre id�e, proposition ou n'importe quoi, faites vous plaisir (et � moi aussi par la m�me occasion )

  10. #10
    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
    Bon, je suis pas encore tout � fait sur d'utiliser boost, m�me si je vois mal comment faire sans. Toujours est il que je me pose une question au niveau de la compatibilit� 32/64 bits. A mon avis �a ne doit pas poser de probl�me mais je n'en suis pas sur. Si quelqu'un peut m'�clairer � ce sujet.

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