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コードです。前もって感謝します。
Boost.Pythonは偉大なライブラリですが、それが埋め込まれたインタラクティブなインタプリタを持っていません。 'boost/python/exec.hpp'には、Pythonコード' eval'、 'exec'、' exec_file'を評価する関数がありますが、対話的に使うものはありません。 –
はい、ただし、boost.pythonはC APIの100%の置き換えではありません。あなたのケースでは、PyRun_InteractiveLoopFlags()(http://docs.python.org/c-api/veryhigh.html#PyRun_InteractiveLoopFlags)関数を使用して対話型コンソールを起動します。 –
ラファエル、あなたはあなたのコメントを回答に上げていただけますか?私はPyRun_InteractiveOneFlagsが一度にステートメントを進めることもあります。エラーコードが表示されていませんが、それは他の場所で利用できる可能性があります。 –