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

  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
    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
    Tu penses � quelques choses comme �a :
    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
    #include <Python.h>
     
     
    int main(int argc, wchar_t *argv[])
    {
        Py_SetProgramName(argv[0]);
        Py_Initialize();
     
        wchar_t *path = Py_GetPath();
        Py_SetPath(path);
     
     
        //PyRun_SimpleString("import sys; sys.path.append('.')");
        PyRun_SimpleString("from mytest import fctTest2");
        PyRun_SimpleString("fctTest2()");
        Py_Finalize();
     
        return 0;
    }
    Malheureusement �a me sort �a :
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    ImportError: No module named 'mytest'
    Traceback (most recent call last):
    File "<string>", line 1, in <module>
    NameError: name 'fctTest2' is not defined
    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

  8. #8
    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
    Le sujet est-il r�solu ou non ?
    Tu retombes sur une erreur Python, ton exe ne sait pas o� trouver le fichier.

    Es-tu s�r de ce que tu passes � Py_SetProgramName ?
    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.

  9. #9
    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 Bousk Voir le message
    Le sujet est-il r�solu ou non ?
    Ben moi j'aimais bien ma solution de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    PyRun_SimpleString("import sys; sys.path.append('.')")
    mais tu m�incites � trouver une meilleure soluce , donc disons que maintenant il est r�solu � moiti� (je d�tag )

    Citation Envoy� par Bousk Voir le message
    Tu retombes sur une erreur Python, ton exe ne sait pas o� trouver le fichier.
    Il cherche pas beaucoup... il est juste � cot� de lui, dans le m�me r�pertoire

    Citation Envoy� par Bousk Voir le message
    Es-tu s�r de ce que tu passes � Py_SetProgramName ?
    Alors l� tu me pose une bonne colle... � priori la b�b�te ne renvoie rien (doc : void Py_SetProgramName(char *name)) donc je sais pas trop comment v�rifier ceci.

    Par contre, venant de trouver comment lire en clair un wchar_t, je peux dire que j'ai effectivement un souci de path :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    wchar_t *path = Py_GetPath();
    std::wcout << path << std::endl;
    me renvoie :
    /usr/lib/python3.3/:/usr/lib/python3.3/plat-x86_64-linux-gnu:/usr/lib/python3.3/lib-dynload
    Je pourrais essayer de passer le r�pertoire courant dans Py_SetPath(), mais �a ne marche pas top � priori puisque :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    wchar_t *pathScript = L".";
    Py_SetPath(pathScript);
    ne me permet pas d'ex�cuter correctement le code python (m�me erreur que ci-dessus).
    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

  10. #10
    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 si le fichier se trouve juste � c�t� de l'exe, c'est que l'appel � Py_SetProgramName ne doit pas �tre bon.
    Mais si la premi�re astuce passe, autant la garder^^ sans le py_SetProgramName je n'�tais pas s�r que �a passe.
    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.

  11. #11
    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
    Si jamais tu retrouves des traces de la mani�re que tu utilisais, �a m'int�resse tout de m�me au cas o�

    EDIT :

    Et puis il me reste aussi � trouver le moyen de r�cup�rer dans une variable C++ le return de ma fonction fctTest2() lorsque je fais :
    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

  12. #12
    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 similaire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    Py_SetProgramName(...);
    .. export de modules ici ..
    Py_SetPath(L"Py"); // les modules python classiques sont dans un dossier Py à coté de l'exe
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('Scripts')"); // mes scripts sont dans un dossier Scripts à côté de l'exe
    Pour r�cup�rer le r�sultat de l'appel d'une fonction Python, il faut utiliser PyObject_CallObject, PyObject_CallFunctionObjArgs et consors, mais pour cr�er le param�tre PyObject n�cessaire, c'est pas forc�ment �vident... peut-�tre t'y prends-tu juste mal, comment sais-tu quel callback python appel�e ? Le C++ fournit-il une "SetCallback" pour l'initialiser ?
    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.

  13. #13
    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 Bousk Voir le message
    En fait c'est similaire
    Ahhh ben tu me rassures

    Citation Envoy� par Bousk Voir le message
    Pour r�cup�rer le r�sultat de l'appel d'une fonction Python, il faut utiliser PyObject_CallObject, PyObject_CallFunctionObjArgs et consors, mais pour cr�er le param�tre PyObject n�cessaire, c'est pas forc�ment �vident... peut-�tre t'y prends-tu juste mal, comment sais-tu quel callback python appel�e ? Le C++ fournit-il une "SetCallback" pour l'initialiser ?
    Tu crois ????

    C'est m�me un sacr� bazar en fait ...
    Le premier exemple que j'ai donn� montre assez bien comment manipuler des nombres... je me suis int�ress� aux strings.
    Voila mon dernier morceau de code :

    Code cpp : 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
    #include <Python.h>
    #include <iostream>
    #include <stdlib.h>
     
    using namespace std;
     
    string fctPython(char *pScript, char *pFunct, PyObject *pArgs);
     
     
    int main(int argc, char *argv[])
    {
        PyObject *pArgs1, *pArgs2, *pValue1_1, *pValue1_2;
        char *module = "myTest", *fct1 = "functString";
     
        Py_Initialize();
        PyRun_SimpleString("import sys; sys.path.append('.')");
     
        /*Essai de functString*/
        pArgs1 = PyTuple_New(2);
     
        pValue1_1 = PyBytes_FromFormat("%s","functString : ceci est l'essai n°");
        PyTuple_SetItem(pArgs1, 0, pValue1_1);
     
        pValue1_2 = PyBytes_FromFormat("%i",1);
        PyTuple_SetItem(pArgs1, 1, pValue1_2);
     
        string resultat1 = fctPython(module, fct1, pArgs1);
        cout << resultat1 << endl;
     
        Py_Finalize();
        return 0;
    }
     
    string fctPython(char *pScript, char *pFunct, PyObject *pArgs)
    {
        PyObject *pName, *pModule, *pFunc, *pValue;
     
        pName = PyUnicode_FromString(pScript);
        pModule = PyImport_Import(pName);
        pFunc = PyObject_GetAttrString(pModule, pFunct);
     
        pValue = PyObject_CallObject(pFunc, pArgs);
     
        return PyBytes_AsString(pValue);
    }

    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    def functString(a, b):
        w = ", avec essai d'une phrase écrite dans le script python"
        v = w.encode(encoding='UTF-8')
        print (type(a), type(b), type(v))
        c = a + b + v 
        return c

    Il y a pas mal de choses sympa � faire mais �a demande vraiment pas mal de recherche, trop de recherche en fait... et je mesure mieux la remarque de jblecanard : Tu vas cr�er un monstre de complexit�

    Le sujet est vraiment vaste et int�ressant, mais �a manque vraiment de doc et de fonctions plus proche de l'esprit Python : faire en peu de lignes des choses simples et moins simples aussi.

    Pour revenir � mon probl�me initial, outre la distribution, passer mon programme en C++ me permettrait de b�n�ficier plus rapidement des avanc�es de Qt notamment celles li�es � Qt Quick qui s'enrichit de jour en jour. � titre d'exemple, la version Qt dans mes d�p�ts �tant la version 5.1.1, je n'ai pas r�ussi � b�n�ficier pleinement de la version 5.2 de PyQt, alors que j'ai bien la version 5.2 de Qt (install�e depuis les binaires), faudrait d'ailleurs que je me penche l�-dessus.

    Et puis il faut bien l'avouer, depuis le temps que j'ai tent� de commencer � envisager l'apprentissage de C++, je vais pas m'arr�ter en si bon chemin ... faut juste que je rebosse � fond les pointeurs car c'est encore un peu obscure pour moi c'te b�te.

    Donc je pense que le plus raisonnable serait de continuer tranquilou mon programme en Python et en parall�le le transcrire en C++, et si jamais je tombe sur une fonction vraiment casse bonbon � faire en C++ mode bourrin : je lance la fonction Python avec PyRun_SimpleString et comme j'ai pas encore trouv� comment r�cup�rer le r�sultat , je stock ce dernier dans un fichier que je r�cup�re en C++ apr�s...

    Merci � vous deux en tout cas, et si vous o d'autres ont des remarques n'h�sitez pas

    ++

    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

  14. #14
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    D�tails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par d�faut
    Salut,

    Juste pour dire que si tu veux vraiment apprendre le C++ apprends-le � fond, c'est tout sauf perdu.

  15. #15
    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)

  16. #16
    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

  17. #17
    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.

  18. #18
    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
    Bon ben du coup tu m'as pouss� � tester et effectivement �a merdouille...D�j� � l'installationuntu-fr.org/viewtopic.php?pid=15346621"]D�j� � l'installation[/URL] de cx_Freeze en ce qui me concerne, et ensuite � l'ex�cution.

    J'ai une autre piste en utilisant cython... j'ai d�j� r�ussi � cr�er un ex�cutable avec mais je n'ai pas eu l'occasion de tester sur une autre machine et en plus il y a un morceau de commande que je n'arrive pas � retrouver
    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

  19. #19
    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
    Citation Envoy� par Jiyuu Voir le message
    Donc je pense que le plus raisonnable serait de continuer tranquilou mon programme en Python et en parall�le le transcrire en C++
    Oui

    Citation Envoy� par Jiyuu Voir le message
    Donc je pense que le plus raisonnable serait de continuer tranquilou mon programme en Python et en parall�le le transcrire en C++, et si jamais je tombe sur une fonction vraiment casse bonbon � faire en C++ mode bourrin : je lance la fonction Python avec PyRun_SimpleString et comme j'ai pas encore trouv� comment r�cup�rer le r�sultat , je stock ce dernier dans un fichier que je r�cup�re en C++ apr�s...
    Non, c'est mal, surtout que tu vas rencontrer ce probl�me in�vitablement, vu la richesse de la lib standard de Python. Et comme tu dans une saine d�marche d'apprentissage, il vaut mieux rester rigoureux, surtout avec C++ qui est un langage exigeant.

    Citation Envoy� par minnesota Voir le message
    Juste pour dire que si tu veux vraiment apprendre le C++ apprends-le � fond, c'est tout sauf perdu.
    Enti�rement d'accord.

    Note aussi que lorsque tu fais des bricoles ou tu �changes des donn�es entre C++ et un autre langage, il faut faire attention � la gestion de la m�moire. Un petit coup de valgrind sur ton prototype existant risque de r�v�ler quelques surprises !

  20. #20
    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


    Merci pour tous ces conseils.
    Concernant mon apprentissage de C++, je reste pour le moment bien bloqu� sur les pointeurs et r�f�rences et surtout leur utilit� !!! z'�tes tordus les gars

    J'ai voulu mettre la charrue bien avant les b�ufs en essayant de chercher un moyen de lancer du python via C++... on va reprendre tout ceci dans l'ordre.

    Encore merci � tous.
    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

+ 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