Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python API] Appeller une fonction Python depuis le C++

Je ne comprends pas l'exemple de la documentation

Sujet résolu
Anonyme
    18 octobre 2007 à 8:44:47

    Bonjour,

    Le titre en dit déjà long. Je souhaiterai utiliser l'interpréteur Python dans une application, et j'ai du mal à comprendre comment appeller une fonction Python depuis l'application C++.

    Mon code actuel (issu de cette page) :
    1. #include <iostream>
    2. #include <Python.h>
    3. #include <string>
    4. using namespace std;
    5. int main()
    6. {
    7.         Py_Initialize();
    8.         PyObject *module = NULL, *fonction = NULL;
    9.         PyObject *arguments, *valeur;
    10.         string fileName = "script";
    11.         string nomFonction = "fonction";
    12.     module = PyImport_AddModule(fileName.c_str());
    13.     module = PyImport_ImportModule(fileName.c_str());
    14.         if(module!=NULL)// Si le fichier a été correctement chargé
    15.         {
    16.         cout << PyModule_GetName(module) << " charge.\n";
    17.         if(!PyObject_HasAttr(module, PyString_FromString(nomFonction.c_str())))
    18.             cout << "\"Attribut\" introuvable... :(\n";
    19.             fonction = PyObject_GetAttrString(module, nomFonction.c_str());
    20.             if(fonction && PyCallable_Check(fonction))// On vérifie si la fonciton existe et si elle peut être appellée
    21.             {
    22.                 //Préparation des arguments
    23.                 arguments = PyTuple_New(2); // 2 est le nombre d'arguments
    24.                 valeur = PyInt_FromLong(8); // 10 est la valeur du premier argument
    25.                 PyTuple_SetItem(arguments, 0, valeur)// 0 est le numéro de l'argument (le premier argument est l'argument 0)
    26.                 valeur = PyInt_FromLong(5); // 5 est la valeur du second argument
    27.                 PyTuple_SetItem(arguments, 1, valeur);
    28.                 //Appel de la fonction (un grand moment !)
    29.                 valeur = PyObject_CallObject(fonction, arguments); // Simple, non ? :-)
    30.                 //Nettoyage des arguments
    31.                 Py_DECREF(arguments);
    32.                 //Verification du réslutat de l'appel de la fonction et affichage de la valeur retournee
    33.                 if(valeur != NULL)
    34.                 {
    35.                     cout << "L'appel de la fonction a retourné: "<<PyInt_AsLong(valeur)<<endl;
    36.                     Py_DECREF(valeur);
    37.                 }
    38.             }
    39.             else
    40.             {
    41.                 cout << "-> donc pas de fonction a appeller.\n";
    42.                 return 1;
    43.             }
    44.         }
    45.         else
    46.         {
    47.         cout << "Module introuvable.\n";
    48.         return 1;
    49.         }
    50.         Py_Finalize();
    51.         return 0;
    52. }


    A côté de l'exécutable, il y a un dossier nommé "script" dans lequel le script du même nom est placé (script.py). A l'exécution, le script se charge mais impossible d'appeller la fonction.

    Script Python :
    1. # -*- coding: utf-8 -*-
    2. def fonction(longueur, largeur):
    3.     if longueur > 9:
    4.         return longueur*largeur - 8
    5.     else:
    6.         return longueur*largeur +1


    J'ai regardé une autre page qui me semble assez appropriée mais je ne comprends pas ce qu'est un callback et comment on l'utilise, et le rôle des fonctions comme Py_INCREF().

    Quelqu'un aurait des pistes ?

    Merci !
    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2007 à 15:15:48

      essaye de mettre en nom du fichier "script.py" au lieu de "script"
      • Partager sur Facebook
      • Partager sur Twitter
        21 octobre 2007 à 17:21:15

        Pourquoi essayer de mettre script.py au lieu de script?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          22 octobre 2007 à 13:31:39

          Citation : ostream

          Pourquoi essayer de mettre script.py au lieu de script?


          Parce que j'ai constaté que ça ne marche pas.

          Entre temps, j'ai trouvé la solution :
          Avant d'exécuter la fonction, il faut exécuter le fichier dans lequel elle est déclarée. Pour cela, j'ouvre un fichier (sans passer par Python, juste avec la SL), je l'exécute avec la fonction PyRun_SimpleFile(), ensuite j'ajoute le module avec la fonction PyImport_AddModule("__main__"), puis je récupère le dictionnaire qui contient tous les éléments du fichier, par la fonction PyModule_GetDict().

          C'est avec ce dictionnaire qu'on accède à la fonction Python, en utilisant PyDict_GetItemString(). Et yop, ça fonctionne.
          J'ai fait une petite classe pour simplifier le tout, comme ça je n'ai plus qu'à faire ceci :
          1. PythonScript script("monscript.py");
          2. PyObject *arguments = PyTuple_New(0);
          3. cout << "Valeur retournée : " << script.executerFonction("NomDeMaFonction", arguments) << endl;
          • Partager sur Facebook
          • Partager sur Twitter

          [Python API] Appeller une fonction Python depuis le C++

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown