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

Interfaçage autre langage Python Discussion :

C++ pointer to Py Object


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut C++ pointer to Py Object
    Bien le bonjour !

    Je cherche et hélas ne trouve pas le moyen de passer un pointeur c++ comme argument à l'appel d'une fonction python avec l'api C.
    Pour l'explication, j'ai une application C++ qui intègre un interpréteur python et fait donc des appels vers des scripts python externes.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Py_Initialize();
     
    PyObject *pName, *pModule, *pDict, *pFunc;
    PyObject *pArgs, *pValue;
     
    pName = PyString_FromString("module");
        /* Error checking of pName left out */
     
        pModule = PyImport_Import(pName);
        Py_DECREF(pName);
     
        if (pModule != NULL) {
            pFunc = PyObject_GetAttrString(pModule, "main");
            /* pFunc is a new reference */
     
            if (pFunc && PyCallable_Check(pFunc)) {
                pArgs = PyTuple_New(1);
                pValue = PyInt_FromLong(452);
                if (!pValue) {
                    Py_DECREF(pArgs);
                    Py_DECREF(pModule);
                    std::cout <<  "Cannot convert argument" << std::endl;
                }
                // pValue reference stolen here: 
                PyTuple_SetItem(pArgs, i, pValue);
            }
     
                pValue = PyObject_CallObject(pFunc, pArgs);
                Py_DECREF(pArgs);
                if (pValue != NULL) {
    		return PyInt_AsLong(pValue);
                    Py_DECREF(pValue);
                }
                else {
                    Py_DECREF(pFunc);
                    Py_DECREF(pModule);
                    PyErr_Print();
    		std::cout << "Call failed" << std::endl;
                }
            }
            else {
                if (PyErr_Occurred())
                    PyErr_Print();
    		std::cout << "Cannot find function main" << std::endl;
            }
            Py_XDECREF(pFunc);
            Py_DECREF(pModule);
        }
        else {
            PyErr_Print();
    	std::cout << "Failed to load " << "module.py" << std::endl;
        }
     
    Py_Finalize();
    Bref. Dans tout ce bout de code qui n'est présent que pour expliquer un peu mieux mon soucis, j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pValue = PyInt_FromLong(452);
    Qui me sert donc à wrapper un objet de type long c++ en objet de type int python. Je cherche à faire la même chose avec un pointeur c++, mettons un pointeur sur string que je pourrais envoyer en paramètre à l'appel de la fonction main de mon script. Le but étant de pouvoir modifier la valeur pointé depuis le script sans avoir de retour à faire de sa part.

    Hélas, je ne trouve pas comment faire.

    Si quelqu'un a une idée, merci d'avance =)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Mon problème est peut être mal exposé.

    Pour faire simple. J'aimerais pouvoir modifier un objet créé dans l'application C++ dans le script python appelé et du coup, récupérer sa valeur sans avoir recours au return. Le but étant de garder le return libre pour un éventuel message d'erreur.

    Donc typiquement, que le principe des pointeurs puisse s'étendre à mon script python.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Je me pose aussi une question. Mon problème pourrait il être plus facilement résolu avec un outil comme SWIG ? L'option de Boost n'étant pas envisageable.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Je reviens vers vous, même si pour l'instant personne ne me répond, mais je ne perd pas espoir.

    Jusqu'à maintenant, je faisais des tests en envoyant en paramètres de ma fonction un int ou une string. Hors, j'ai remarqué plus tard que ces deux éléments étaient imutable. Il me faudrait donc passer par une liste par exemple.

    J'ai donc tenté ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PyObject *a = Py_BuildValue("[i]:ref", 10);
     
    PySys_SetPath("..\\Plugin;..\\lib;..\\lib\\site-packages");
    pName = PyString_FromString(CStringA(vPluginAdr[count]));
     
    pModule = PyImport_Import(pName);
    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, "GetInfo");
        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(1);
            PyTuple_SetItem(pArgs, 0, a);
            pValue = PyObject_CallObject(pFunc, pArgs);
        }
    }
    Mais une exception est levée à l'appel de PyObject_CallObject.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/11/2003, 18h38
  2. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21
  3. templates et smart pointers
    Par delire8 dans le forum C++
    Réponses: 9
    Dernier message: 10/07/2003, 16h26
  4. Réponses: 5
    Dernier message: 05/07/2003, 11h52
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    Réponses: 7
    Dernier message: 31/08/2002, 01h44

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