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

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

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

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

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

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    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...

  7. #7
    screetch
    Invité(e)
    Par défaut
    pour faire un module, mets le dans un repertoire du meme nom que ton module et ajoute un fichier __init__.py (je crois), meme vide. Ca ca doit etre un module python. ensuite, donne le nom du repertoire pour le module.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai fait comme tu m'as dit :
    J'ai créé un répertoire nommé "script" dans lequel j'ai mis le fichier script.py et le fichier __init__.py.
    Mais ça ne marche pas.
    Toujours dans cette configuration, j'ai fait un test : j'ai créé un autre script python qui appelle le premier, que j'ai placé dans le répertoire racine de mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from script import *
     
    print fonction(9, 78)
    J'ai retiré le fichier script.py qui était resté dans le répertoire racine, j'ai lancé le second script par le biais de l'interpréteur python, et il fonctionne. Python va donc chercher le script dans son dossier, mais pas avec l'API...

  9. #9
    screetch
    Invité(e)
    Par défaut
    as tu regardé les autres fonctions d'import listées sur cette page :
    http://docs.python.org/api/importing.html

    a mon avis tu devrais utiliser PyImport_ImportModule mais je ne suis pas sur

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    A première vue ça ne marche pas, mais si j'appelle avant la fonction PyImport_AddModule(), ça marche !

    Par contre, ça bloque au niveau de l'appel de la fonction : la fonction PyModule_GetAttrString() renvoie NULL...

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