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 :

[Python API] Charger un script


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut [Python API] Charger un script
    Bonjour,

    Pour utiliser python en tant que langage de script dans mon logiciel, j'utilise l'API Python. J'ai regardé la doc, et je cherche à charger un script par son chemin d'accès. J'ai vu cet exemple mais on ne peut que charger les modules de base et pas un fichier.

    Comment faire ?

    Merci !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il est capable normalement d'utiliser tout fichier .py, non ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    J'ai essayé ce code source (en C++) :
    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
    #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.py";
    	string nomFonction = "fonction";
     
        module = PyImport_Import(PyString_FromString(fileName.c_str()));
     
    	if(module!=NULL)// Si le fichier a été correctement chargé
    	{
            cout << fileName << " charge.\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(1); // 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 << "Pas de fonction a appeller.\n";
    	        return 1;
    	    }
     
    	}
    	else
    	{
            cout << "Module introuvable.\n";
            return 1;
    	}
     
     
    	Py_Finalize();
    	return 0;
    }
    Si j'essaye avec "math" comme nom de module et sin comme nom de fonction, ça marche. Mais pas avec un chemin d'accès... (avec ou sans esxtension .py, en chemin absolu ou relatif...)

    Code python, dans script.py dans le répertoire de l'exécutable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def fonction(longueur, largeur):
        if longueur > 9:
            return longueur*largeur - 8
        else:
            return longueur*largeur +1

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Comme tu dois charger un module, je suppose qu'il ne faut pas mettre le .py derrière ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Avec ou sans .py, c'est la même chose.
    J'ai essayé en chemin absolu (là aussi, avec ou sans .py), mais sans succès.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    J'ai compilé l'example de la doc, et c'est la même erreur qui se produit...
    J'ai surement raté un truc au niveau de la création du script, ou du nomage du fichier...

Discussions similaires

  1. [Python API 2.3] Segfault avec PyInt_FromLong
    Par efficks dans le forum Interfaçage autre langage
    Réponses: 2
    Dernier message: 26/06/2008, 15h02
  2. [Python API 2.3] Segfault avec PyInt_FromLong
    Par efficks dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 26/06/2008, 00h37
  3. Charger plusieurs scripts a l'ouverture de la page
    Par tchoukapi dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 07/04/2008, 18h25
  4. Api python : charger un script python
    Par acieroid dans le forum C
    Réponses: 4
    Dernier message: 05/11/2007, 19h18
  5. [Python API] Appeller une fonction Python depuis le C++
    Par wetneb dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 18/10/2007, 12h49

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