2011-01-04 3 views
3

Je voudrais créer un interpréteur Python intégré dans mon application C/C++. Idéalement, cet interpréteur se comporterait exactement comme le véritable interpréteur Python, mais céderait après avoir traité chaque ligne d'entrée. Le module standard Python code regarde de l'extérieur exactement comme je veux, sauf qu'il est écrit en Python. Exemples:Exemple d'interpréteur Python interactif intégré canonique?

>>> import code 
>>> code.interact() 
Python 2.7.1 (r271:86832, Jan 3 2011, 15:34:27) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> 

Le noyau de code est la fonction qui accepte l'entrée d'utilisateur potentiellement incomplète et affiche soit une erreur de syntaxe (cas 1), attend plus d'entrée (cas 2), ou exécute l'entrée de l'utilisateur (cas 3).

try: 
    code = self.compile(source, filename, symbol) 
except (OverflowError, SyntaxError, ValueError): 
    # Case 1 
    self.showsyntaxerror(filename) 
    return False 

if code is None: 
    # Case 2 
    return True 

# Case 3 
self.runcode(code) 
return False 

L'exemple dans l'arbre source Python Demo/embed/demo.c est l'enveloppe extérieure, mais pas ce que je veux parce que cet exemple ne gère que des déclarations complètes. Je suis notamment partie ici pour référence:

/* Example of embedding Python in another program */ 
#include "Python.h" 

main(int argc, char **argv) 
{ 
    /* Initialize the Python interpreter. Required. */ 
    Py_Initialize(); 
    [snip] 
    /* Execute some Python statements (in module __main__) */ 
    PyRun_SimpleString("import sys\n"); 
    [snip] 
    /* Exit, cleaning up the interpreter */ 
    Py_Exit(0); 
} 

Ce que je suis à la recherche est le code C pour traiter des blocs incomplets, stacktraces, etc. C'est, tous les comportements du réel interpréteur Python. Merci d'avance.

Répondre

2

Jetez un oeil à boost.python. C'est une intégretaion fantastique de Python en C++ et vice versa. Mais vous pouvez quand même utiliser l'API C de toute façon. La fonction PyRun_InteractiveLoopFlags() offre une console interactive dans votre application C++.

+1

Boost.Python est une grande bibliothèque, mais il ne dispose pas d'un interpréteur interactif intégré. Dans 'boost/python/exec.hpp' il y a des fonctions pour évaluer le code Python,' eval', 'exec', et' exec_file', mais aucune d'entre elles n'est à usage interactif. –

+0

Oui, mais boost.python n'est pas un remplacement à 100% de l'API C. Dans votre cas, utilisez la fonction PyRun_InteractiveLoopFlags() (http://docs.python.org/c-api/veryhigh.html#PyRun_InteractiveLoopFlags) pour lancer la console interactive. –

+0

Raphael, pourriez-vous s'il vous plaît élever votre commentaire à une réponse? Je vois maintenant qu'il y a aussi PyRun_InteractiveOneFlags qui procède à une déclaration à la fois. Il manque le code d'impression d'erreur, mais cela peut être disponible ailleurs. –

1

Jetez un oeil à ma mise en œuvre d'un interpréteur python en C++. Ce n'est pas exactement "canonique", car il utilise le toolkit Qt et boost.python, et parce qu'il n'est utilisé que pour cette application. Mais je pense que vous trouverez qu'il contient des nuggets utiles que vous pouvez utiliser dans votre programme.

https://svn.janelia.org/penglab/projects/vaa3d/trunk/experimental/brunsc/python_console/PythonInterpreter.h

et

https://svn.janelia.org/penglab/projects/vaa3d/trunk/experimental/brunsc/python_console/PythonInterpreter.cpp