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) :
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
56
57
58
59
60
61
62
63
64
65
66
 
#include <iostream>
 
#include <Python.h>
#include <string>
 
using namespace std;
 
int main()
{
        Py_Initialize();
 
        PyObject *module = NULL, *fonction = NULL;
        PyObject *arguments, *valeur;
        string fileName = "script";
        string nomFonction = "fonction";
 
    module = PyImport_AddModule(fileName.c_str());
    module = PyImport_ImportModule(fileName.c_str());
 
        if(module!=NULL)// Si le fichier a été correctement chargé
        {
        cout << PyModule_GetName(module) << " charge.\n";
        if(!PyObject_HasAttr(module, PyString_FromString(nomFonction.c_str())))
            cout << "\"Attribut\" introuvable... :(\n";
            fonction = PyObject_GetAttrString(module, nomFonction.c_str());
 
            if(fonction && PyCallable_Check(fonction))// On vérifie si la fonciton existe et si elle peut être appellée
            {
                //Préparation des arguments
                arguments = PyTuple_New(2); // 2 est le nombre d'arguments
                valeur = PyInt_FromLong(8); // 10 est la valeur du premier argument
                PyTuple_SetItem(arguments, 0, valeur);  // 0 est le numéro de l'argument (le premier argument est l'argument 0)
                valeur = PyInt_FromLong(5); // 5 est la valeur du second argument
                PyTuple_SetItem(arguments, 1, valeur);
 
                //Appel de la fonction (un grand moment !)
                valeur = PyObject_CallObject(fonction, arguments); // Simple, non ? :-)
 
                //Nettoyage des arguments
                Py_DECREF(arguments);
 
                //Verification du réslutat de l'appel de la fonction et affichage de la valeur retournee
                if(valeur != NULL)
                {
                    cout << "L'appel de la fonction a retourné: "<<PyInt_AsLong(valeur)<<endl;
                    Py_DECREF(valeur);
                }
            }
            else
            {
                cout << "-> donc pas de fonction a appeller.\n";
                return 1;
            }
 
        }
        else
        {
        cout << "Module introuvable.\n";
        return 1;
        }
 
 
        Py_Finalize();
        return 0;
}

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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
# -*- coding: utf-8 -*-
def fonction(longueur, largeur):
    if longueur > 9:
        return longueur*largeur - 8
    else:
        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 !