2011-01-04 9 views
3

C/C++アプリケーションに組み込みのPythonインタプリタを作成したいと思います。理想的には、このインタプリタは実際のPythonインタプリタとまったく同じように動作しますが、入力の各行を処理した後に生成されます。標準のPythonモジュールcodeは、Pythonで書かれている点を除いて、私が望むものとまったく同じように見えます。例えば:標準的な埋め込みインタラクティブなPythonインタプリタの例?

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

codeのコアは、潜在的に不完全なユーザ入力を受け入れ、構文エラー(ケース1)を表示するいずれかの関数である、ユーザ入力(ケース3より入力(ケース2)を待つ、または実行)。

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 

PythonのソースツリーDemo/embed/demo.cの例では、外殻であるが、その一例が、唯一の完全なステートメントを処理するため、私は望んでいないものを。私は参考のために、ここでその一部を含めています:

/* 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); 
} 

は私が探している不完全であるなどのブロック、スタックトレース、本物のPythonインタプリタのすべての行動を処理するためのCコードです。前もって感謝します。

答えて

2

boost.pythonをご覧ください。これはPythonをC++で、そしてその逆にすることで素晴らしいものです。

しかし、とにかくC APIを使用することができます。 PyRun_InteractiveLoopFlags()関数は、C++アプリケーションで対話型コンソールを提供します。

+1

Boost.Pythonは偉大なライブラリですが、それが埋め込まれたインタラクティブなインタプリタを持っていません。 'boost/python/exec.hpp'には、Pythonコード' eval'、 'exec'、' exec_file'を評価する関数がありますが、対話的に使うものはありません。 –

+0

はい、ただし、boost.pythonはC APIの100%の置き換えではありません。あなたのケースでは、PyRun_InteractiveLoopF​​lags()(http://docs.python.org/c-api/veryhigh.html#PyRun_InteractiveLoopF​​lags)関数を使用して対話型コンソールを起動します。 –

+0

ラファエル、あなたはあなたのコメントを回答に上げていただけますか?私はPyRun_InteractiveOneFlagsが一度にステートメントを進めることもあります。エラーコードが表示されていませんが、それは他の場所で利用できる可能性があります。 –

1

私のPythonインタプリタの実装をC++で見てみましょう。これはQtツールキットとboost.pythonを使用しているため、またこの1つのアプリケーションでのみ使用されているため、正確には "標準的"ではありません。しかし、あなたのプログラムに役立つナゲットがいくつか含まれていると思います。

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

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

関連する問題