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 :

Exécuter un code python en C++


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut Exécuter un code python en C++
    Bonjour a tous

    Bon je poste ici car je ne savais pas si il fallait mettre ce post dans le forum Python.

    Donc mon problème est que je cherche a utilisé Python au sein d'un code C++
    afin que l'utilisateur puisse écrire du code python au sein de mon application.

    Par exemple, si l'utilisateur rentre un code simple comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    varA="toi"
    varB=25
    if str(varB).isdigit() and varB>0:
    	str="Bonjour {0} tu as {1} ans".format(varA,varB)
    	print (str)
    	str=str.replace("Bonjour", "Hello")
    	str=str.replace("tu as", "you are")
    	str=str.replace("ans", "")
    	print(str)
     
    else:
    	print ("Error")
    Je voudrai récupérer la sortie ou si il y a une erreur de syntaxe, le traceback.

    Donc pour l'instant voici le code que j'ai produit:
    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
     
     
    #include "PyTrParser.h"
     
    PyTrParser::PyTrParser()
    {
    	Py_Initialize();
    	pyMainModule =PyImport_AddModule("__main__");
    	main_dict =PyModule_GetDict (pyMainModule);
    }
     
    PyTrParser::~PyTrParser()
    {
    	Py_Finalize();
    }
     
    PyObject* PyTrParser::execute(const char* code)
    {
    	return PyRun_String(code, 0, main_dict, main_dict);
    }
    le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	PyTrParser *parser=new PyTrParser;
    	string code="2+3";
    	PyObject * returnObj=parser->execute(code.c_str());
     
    	int i=0;
    	delete returnObj;
    	delete parser;
    Mais celui-ci léve une exeception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.AccessViolationException
    1. Savez-vous si je part dans la bonne direction ?
    2. Avez vous des bon tuto sur ce sujet ? (car la doc est un peux limite)
    3. Savez-vous d'où viens mon erreur et pourquoi ?

    Je vous remercie d'avance pour votre aide

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Boost.python permet d'ecrire des fonctions en C++ et les appelé en python, c'est bien cela ?

    Moi c'est l'inverse que je veux faire.
    un utilisateur écrie du Python et mon code C++ fait l’exécution.

    EDIT: pour l'instant je peux executer du code si il fait une ligne, mais pas plus, donc pas de if, etc....
    une idée ?

  4. #4
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Non, boost::python permet aussi d'appeler du code python depuis un program c++:
    http://www.boost.org/doc/libs/1_50_0...embedding.html

    Pour récupérer les messages d’erreurs venant de python, d’idée est de remplacer sys.stderr/sys.stdout par ton propre flux qui fait... ce que tu veux^^.
    Je l'ai déjà fait mais malheureusement je n'est pas le code sous la main.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Bon, après avoir discuté avec mon tuteur de stage, pas moyen d'utilisé Boost....

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    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 actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Bien sur, voici ce que j'ai produit en suivant cette même doc:
    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
     
    string PyTrParser::execute(const char* codePy)
    {
    	PyCodeObject* code = (PyCodeObject*) Py_CompileString(codePy, "Parser", Py_file_input );
    	PyObject* local_dict = PyDict_New();
    	PyObject* obj = PyEval_EvalCode(code, main_dict, local_dict);
    	PyObject* result = PyObject_Str(obj);
    	PyObject* error=PyErr_Occurred();
     
    	string strReturn;
    	if(PyErr_ExceptionMatches(error)==0)
    		strReturn=PyString_AsString(result); // Retourne toujours None
    	else
    	{
    		strReturn=PyString_AsString(PyObject_Repr(error)); // Retourne le nom de l'exception et non le traceBack
    	}
     
    	return strReturn;
    }
    Comme je l'ai indiqué en commentaire dans le code:
    --> Si il n'y a pas d'erreur, le retour de l’exécution vos toujours None
    --> Si il y a une erreur, je n'arrive pas a récupérer la traceBack, je récupère juste le nom de l'exception.

    Pour c'est deux problème, je ne trouve pas de solution pour l'instant

    EDIT: j'ai trouver pour la recuperation de l'erreur

    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
     
    string PyTrParser::execute(const char* codePy)
    {
    	PyCodeObject* code = (PyCodeObject*) Py_CompileString(codePy, "Parser", Py_file_input );
    	PyObject* local_dict = PyDict_New();
    	PyObject* obj = PyEval_EvalCode(code, main_dict, local_dict);
    	PyObject* result = PyObject_Str(obj);
    	PyObject* error=PyErr_Occurred();
     
    	string strReturn;
    	if(PyErr_ExceptionMatches(error)==0)
    		strReturn=PyString_AsString(result); // Retourne toujours None
    	else
    	{
    			PyObject *ptype, *pvalue,*ptraceback;
     
    		PyErr_Fetch(&ptype, &pvalue, &ptraceback);
    		PyTracebackObject* traceback = (PyTracebackObject*)ptraceback;
     
    		strReturn=PyString_AsString(PyObject_Str(ptype));
    		strReturn.append("\n");
    		strReturn.append(PyString_AsString(PyObject_Str(pvalue)));
    		strReturn.append("\nError in line: ");
    		int lineNo=traceback->tb_lineno;
    		std::stringstream strStream;
    		strStream << lineNo;
    		strReturn.append(strStream.str());
     
    		PyErr_Clear();
    	}
     
    	return strReturn;
    }

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je ne vois rien dans ton code qui ressemble à l'exemple.

    Et en particulier cette ligne qui a l'air intéressante : PyErr_Print();

    Tu as également un module python de traceback.
    Et cet article qui traite de l'embedding traceback.
    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
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Points : 227
    Points
    227
    Par défaut
    Arf, je viens d'éditer, j'ai trouver comment avoir l'erreur
    Il ne me reste plus que le "petit" problème du None lorsque cela devrais fonctionner

    EDIT: bon après bien trop d'heure de recherche, je viens d’intégrer le moteur JS V8 de google (aucun problème pour l'intégration) qui me permet lui aussi d'offrir un moteur de script a mes utilisateurs.

    Merci a tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonctionnement de l'exécution du code en Python
    Par cal23 dans le forum Général Python
    Réponses: 6
    Dernier message: 06/08/2014, 22h00
  2. Exécution de code python
    Par P.G dans le forum Général Python
    Réponses: 5
    Dernier message: 17/01/2014, 20h34
  3. Exécuter code python en PHP
    Par Pchom dans le forum Langage
    Réponses: 2
    Dernier message: 20/04/2013, 17h59
  4. Exécuter du code python dans un string (python -c cmd)
    Par piloupy dans le forum Général Python
    Réponses: 2
    Dernier message: 14/11/2010, 01h10
  5. Réponses: 7
    Dernier message: 03/02/2005, 17h20

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