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 :

Appel d'un script Python dans C++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    R�dacteur/Mod�rateur

    Avatar de Jiyuu
    Homme Profil pro
    D�veloppeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par d�faut Appel d'un script Python dans C++


    Je m'essaye aux appels d'un script Python dans un code C++ et je suis tomb� sur la page suivante de la doc officielle de Python : http://docs.python.org/3/extending/e...pure-embedding

    Malheureusement �a ne fonctionne pas comme voulu et je bloque notamment � la ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    pFunc = PyObject_GetAttrString(pModule, argv[2]);
    Voici ce que j'ai actuellement :

    test1.cpp
    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
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <Python.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        PyObject *pName, *pModule, *pDict, *pFunc;
        PyObject *pArgs, *pValue;
        int i;
     
        if (argc < 3) {
            fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
            return 1;
        }
     
        Py_Initialize();
        pName = PyUnicode_FromString(argv[1]);
     
        pModule = PyImport_Import(pName);
        Py_DECREF(pName);
     
        if (pModule != NULL) {
            pFunc = PyObject_GetAttrString(pModule, argv[2]);
     
            if (pFunc && PyCallable_Check(pFunc)) {
                cout << "Appel de la fonction " << argv[2] << " du module " << argv[1] << " réussi" << endl;
            }
            else
            {
                cout << "Erreur lors de l'appel de la fonction " << argv[2] << " du module " << argv[1] << endl;
            }
        }
        // je m'arrête volontairement là car je ne parviens pas à passer cette étape.
        Py_Finalize();
        return 0;
    }
    test.py
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    def functTest(): 
        print("contrôle depuis Python : ok");
    test1.pro
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    SOURCES += main.cpp
     
    LIBS += -L /usr/lib/python3.3/config-3.3m-x86_64-linux-gnu -lpython3.3
    INCLUDEPATH += -I /usr/include/python3.3m/
    Je suis assez ennuy� car il s'agit de la doc officielle et pourtant �a merdouille...

    Quelqu'un aurait-il une id�e ?

    D'avance merci

    ++

    J
    Initiation � Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez � la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont l� pour �a

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    Tu devrais plut�t t'attarder sur cet exemple simple : http://docs.python.org/3/extending/e...evel-embedding
    Le pure embedding a peu d'int�r�t amha, l'essentiel �tant � priori l'utilisation de http://docs.python.org/3/c-api/veryh...n_SimpleString pour r�aliser import et appel de m�thodes Python depuis le C++.

    Je vais pas pouvoir t'aider plus dans l'imm�diat, mais ce soir de chez moi je pourrai te montrer comment r�aliser ceci.
    S'il s'agit d'appeler des m�thodes d'un script .py depuis le C++ c'est plus simple que l'inverse, mais l'initialisation de Python est un peu obscure et la doc loin d'�tre claire amha. J'ai d� tatoner pas mal avant d'avoir un code fonctionnel.

    As-tu bien un projet Python qui compile correctement et que tu arrives � linker ? C'est assez difficile, perso j'ai du modifier les sources, trouver les flags de compil etc avant d'y parvenir..
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    R�dacteur/Mod�rateur

    Avatar de Jiyuu
    Homme Profil pro
    D�veloppeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par d�faut
    et merci � toi.

    Alors tout d'abord, chose importante, je suis un grand d�butant en C++. J'ai gal�r� comme pas possible pour trouver un "bon" tutoriel qui parte d'une hypoth�se simple : le lecteur n'ai jamais programm� quoique ce soit de sa vie. Heureusement j'ai pu trouver celui-ci durant mes vacances.

    Citation Envoy� par Bousk Voir le message
    Salut,

    Tu devrais plut�t t'attarder sur cet exemple simple : http://docs.python.org/3/extending/e...evel-embedding
    Le pure embedding a peu d'int�r�t amha, l'essentiel �tant � priori l'utilisation de http://docs.python.org/3/c-api/veryh...n_SimpleString pour r�aliser import et appel de m�thodes Python depuis le C++.
    Je suis effectivement d�j� tomb� sur le lien que tu donnes, et cette simplicit� me plaisait bien, mais je rencontre aussi quelques probl�mes avec cette fa�on de faire.

    D'ailleurs, je suis oblig� de modifier le code comme ceci si je ne veux pas avoir d'erreur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <Python.h>
     
    int
    main(int argc, wchar_t *argv[]) // remplace de char par wchar_t
    {
      Py_SetProgramName(argv[0]);  /* optional but recommended */ //ou il faut que je commente cette ligne.
      Py_Initialize();
      PyRun_SimpleString("from time import time,ctime\n"
                         "print('Today is', ctime(time()))\n");
      Py_Finalize();
      return 0;
    }
    Citation Envoy� par Bousk Voir le message
    S'il s'agit d'appeler des m�thodes d'un script .py depuis le C++ c'est plus simple que l'inverse, mais l'initialisation de Python est un peu obscure et la doc loin d'�tre claire amha. J'ai d� tatoner pas mal avant d'avoir un code fonctionnel.
    En fait le but de mes recherches est assez simple (et j'esp�re possible ). Je suis actuellement en train de r�aliser une application en PyQt et Qt Quick. Elle avance bien et reste une application assez simple :
    • une interface graphique de saisie de donn�es ;
    • une injection dans une base de donn�es PostgreSQL ;
    • la possibilit� de consulter et modifier les donn�es ;


    Actuellement je teste tout sur ma Debian, j'ai donc toutes les biblioth�ques, etc et je n'ai pas de souci. Cependant je pr�vois de mettre � disposition � certains coll�gues cette application, et se pose donc le "probl�me" de la distribution. Le souci est que rendre la version actuelle (PyQt + Qt Quick) standalone risque d'�tre fort compliqu�, idem pour distribuer Python, les sources et les biblioth�ques n�cessaires. Je pense avoir moins de probl�mes avec C++ (enfin j'esp�re ).

    L'avantage de Qt Quick est que dans l'imm�diat une tr�s grosse partie du travail est d�j� faite par QML et en fait la partie "Python" ne me sert qu'� lancer le programme et travailler sur les donn�es, cha�nes de caract�res, ...

    Mon id�e est donc la suivante :
    1. je cr�e un bout de code C++ histoire de pouvoir dans un premier rendre son lancement "standalone" (pas son fonctionnement en profondeur) �a m'a pris 5min... Impec ;
    2. je recode les manipulations de cha�nes qui peuvent �tre tr�s simples, etc ;
    3. j'embarque Python dans mon code C++ et r�utilise les fonctions un peu longue ou plus complexe � faire en C++ dans un premier temps histoire de ne pas me prendre la t�te.
    .

    Voila pour le but de tout �a ...

    Citation Envoy� par Bousk Voir le message
    As-tu bien un projet Python qui compile correctement et que tu arrives � linker ? C'est assez difficile, perso j'ai du modifier les sources, trouver les flags de compil etc avant d'y parvenir..
    Si je reprends le lien que tu as donn�s plus haut, voici o� j'en suis :
    Cas 1 :
    test.py
    main.cpp
    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
    #include <Python.h>
    #include <fstream>
    #include <string>
    #include <stdio.h>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
      //Py_SetProgramName(argv[0]);  /* optional but recommended */
      Py_Initialize();
     
      /*PyRun_SimpleString ne semble fonctionner que pour des imports de modules présents dans Python.
       C'est à dire pas pour ceux que je peux créer*/
     
      cout << "Essai d'import d'un module python livré d'origine via PyRun_SimpleString" << endl << "Début du test N°1" << endl;
      PyRun_SimpleString ("import os\n"
                         "print(os.getcwd())");
      cout << "Fin du test\n" << endl;
     
     
      cout << "Essai d'import d'un module python créé par moi via PyRun_SimpleString" << endl << "Début du test N°2" << endl;
      PyRun_SimpleString ("import test");
      cout << "Fin du test\n" << endl;
     
      cout << "Essai d'import d'un module python créé par moi via PyRun_SimpleFile" << endl << "Début du test N°3" << endl;
      FILE *pFile;
      pFile = fopen ("test.py","r");
     
      PyRun_SimpleFile(pFile,"test.py");
      cout << "Fin du test\n" << endl;
     
      Py_Finalize();
      return 0;
    }
    test1.pro
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    SOURCES += main.cpp
     
    LIBS += -L /usr/lib/python3.3/config-3.3m-x86_64-linux-gnu -lpython3.3
    INCLUDEPATH += -I /usr/include/python3.3m/
    Chez moi les tests N� 1 & 3 fonctionnent bien. Pas le N� 2.
    Je ne vois pas non plus comment d�clarer dans le test 3 la fonction ou la classe que je veux utiliser.

    J'en reviens donc au m�me point que l'exemple que j'ai cit� au d�but du fil : importer un fichier *.py, pas de souci, mais je gal�re pour utiliser un "vrai" script.

    Une derni�re chose, je travaille avec Qt Creator. Je compile aussi avec ce dernier par d�finition. Je n'ai strictement rien modifi� dans les commandes de compilation. Par contre mon .pro est, actuellement purement identique � ce que je t'ai donn�.
    Donc un probl�me de flags est tr�s possible....

    En tout cas, merci de ton aide donn�e et � venir.

    ++

    J
    Initiation � Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez � la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont l� pour �a

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    Citation Envoy� par Jiyuu Voir le message
    Actuellement je teste tout sur ma Debian, j'ai donc toutes les biblioth�ques, etc et je n'ai pas de souci. Cependant je pr�vois de mettre � disposition � certains coll�gues cette application, et se pose donc le "probl�me" de la distribution. Le souci est que rendre la version actuelle (PyQt + Qt Quick) standalone risque d'�tre fort compliqu�, idem pour distribuer Python, les sources et les biblioth�ques n�cessaires. Je pense avoir moins de probl�mes avec C++ (enfin j'esp�re ).
    Si ton probl�me est la distribution de ton application, la coller dans un ex�cutable C++ est vraiment une tr�s mauvaise id�e, et en particulier si tu n'es pas familier voir bon connaisseur de C++. Tu vas cr�er un monstre de complexit� pour un b�n�fice quasi nul.

    Si tu as des contraintes fortes sur les versions de python et des biblioth�ques pour que tes coll�gues puissent utiliser ton application, une bonne id�e serait d'utiliser virtualenv. Ce sera plus facile de coder un installeur qui met en place un virtualenv fonctionnel avec ton appli dedans plut�t que de construire une sorte bouzin all inclusive en C++ .

  5. #5
    R�dacteur/Mod�rateur

    Avatar de Jiyuu
    Homme Profil pro
    D�veloppeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par d�faut
    Re,

    Merci pour ta contribution jblecanard.
    J'ai entendu parl� de virtualenv que tr�s r�cemment et je crois m�me avoir vu ici ou l� qu'il �tait inclus d'office avec Python 3 (mais je ne pr�f�re pas trop m'avancer de ce cot� )

    Je me doute que la solution que je pr�vois est loin d'�tre optimum, mais elle a quelques avantages :
    • c'est un bon sujet d'apprentissage ;
    • �a me permet de t�ter du C++ ;
    • �a peut m'ouvrir la porte � une migration compl�te du code en C++, ou pas .


    Comme je l'ai dit, le plus gros du programme est fait actuellement avec QML, j'ai donc peu de chose � coder (pour le moment) en Python ou C++, ce qui pourrait limiter la "lourdeur" du projet comme je voulais faire.

    Mais je vais potasser virtualenv... s'il y a plus simple, je ne suis pas non plus sado

    Pour revenir � mon probl�me, j'ai trouv� la solution. C'est presque une histoire de flags... en faite dans mon cas il faut syst�matiquement rajouter :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    PyRun_SimpleString("import sys; sys.path.append('.')");
    apr�s
    C'est tout b�te, mais je n'ai pas vu �a dans la doc... dommage.

    Du coup tous les tests que j'ai donn� ci-dessus fonctionnent.

    Et pour les imports de fonction, il suffit de d�clarer plusieurs Py_SimpleString :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <Python.h>
     
    int main() {
        Py_Initialize();
        PyRun_SimpleString("import sys; sys.path.append('.')");
        PyRun_SimpleString("from mytest import fctTest2");
        PyRun_SimpleString("fctTest2()");
        Py_Finalize();
     
        return 0;
    }
    Initiation � Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez � la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont l� pour �a

  6. #6
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    En fait c'est parce que ajouter "." dans sys n'a strictement rien � voir avec l'embedding, c'est du pur "hack" Python.
    Pour importer un script, il faut savoir o� le trouver. Tout simplement
    Cet artifice est fait via le python.exe, mais il faut le faire toi-m�me dans ton exe.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  7. #7
    Membre chevronn�
    Inscrit en
    Juillet 2012
    Messages
    231
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par d�faut
    Citation Envoy� par Jiyuu
    En fait le but de mes recherches est assez simple (et j'esp�re possible ). Je suis actuellement en train de r�aliser une application en PyQt et Qt Quick. Elle avance bien et reste une application assez simple :
    • une interface graphique de saisie de donn�es ;
    • une injection dans une base de donn�es PostgreSQL ;
    • la possibilit� de consulter et modifier les donn�es ;


    Actuellement je teste tout sur ma Debian, j'ai donc toutes les biblioth�ques, etc et je n'ai pas de souci. Cependant je pr�vois de mettre � disposition � certains coll�gues cette application, et se pose donc le "probl�me" de la distribution. Le souci est que rendre la version actuelle (PyQt + Qt Quick) standalone risque d'�tre fort compliqu�, idem pour distribuer Python, les sources et les biblioth�ques n�cessaires. Je pense avoir moins de probl�mes avec C++ (enfin j'esp�re ).
    Et faire un � ex�cutable � Python via cx_freeze, �a ne r�pondrait pas � ton probl�me de distribution ?
    Je sais que cx_freeze fonctionne avec Python 2 et 3 et qu�il n�y a pas de soucis pour embarquer PyQt (il y a ici un exemple un peu vieux)

  8. #8
    R�dacteur/Mod�rateur

    Avatar de Jiyuu
    Homme Profil pro
    D�veloppeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par d�faut
    Citation Envoy� par grim7reaper Voir le message
    Et faire un � ex�cutable � Python via cx_freeze, �a ne r�pondrait pas � ton probl�me de distribution ?
    Je sais que cx_freeze fonctionne avec Python 2 et 3 et qu�il n�y a pas de soucis pour embarquer PyQt (il y a ici un exemple un peu vieux)


    J'y ai pens� effectivement, mais je sais pas.... une intuition me fait dire qu'avec Qt Quick �a allait merdouiller, et j'ai l'impression que mon intuition �tait pas si folle que �a : http://www.riverbankcomputing.com/pi...ry/033629.html.

    Mais �a m�riterait de se pencher vraiment dessus c'est certain.
    Initiation � Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez � la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont l� pour �a

  9. #9
    Membre chevronn�
    Inscrit en
    Juillet 2012
    Messages
    231
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par d�faut
    Arf�, en effet ^^"
    Bah esp�rons que �a soit rapidement r�solu alors.
    Car �a reste quand m�me la solution la plus simple je pense.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Appel de fonction/script python via PHP
    Par rastalien dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 2
    Dernier message: 21/02/2008, 18h12
  2. Int�grer un script python dans une page Web
    Par Mysti� dans le forum R�seau/Web
    R�ponses: 4
    Dernier message: 02/11/2006, 10h20
  3. [VBS] appel d'un script VBS dans un autre script VBS???
    Par Amandine62 dans le forum VBScript
    R�ponses: 9
    Dernier message: 31/01/2006, 18h17
  4. Interpreter un script python dans un prog python
    Par romeo9423 dans le forum G�n�ral Python
    R�ponses: 3
    Dernier message: 01/12/2005, 16h16
  5. Appel d'un script SQL dans une procdure stock�e
    Par doudou10000 dans le forum Oracle
    R�ponses: 10
    Dernier message: 01/12/2004, 10h01

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