インタプリタインタラクティブループを実行するには、関数PyRun_InteractiveLoop()
を使用する必要があります。それ以外の場合、コードは対話的に入力されないPythonスクリプトファイルで記述されたように動作します。
編集は:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
EDIT2:ここでは、簡単な対話インタプリタの完全なコードですGUIに完全な対話型のインタプリタを実装すると、プロジェクトのビットです。おそらく最も簡単な方法は、疑似ターミナルデバイスに接続された基本的なターミナルエミュレータを作成し、そのデバイスで上記のコードを使用することです。これは自動的にすべての微妙なことを自動的に取得します。
目的が完全なインタラクティブエディタでない場合は、PyRun_String()
とPy_single_input
を開始トークンとして使用することができます。これにより、インタラクティブなインタプリタのようにPythonコードを実行することができます。そのコードがNone
に評価されない単一の式であった場合は、その値の表記がstdoutに出力されます。
#include <Python.h>
int main()
{
PyObject *main, *d;
Py_Initialize();
main = PyImport_AddModule("__main__");
d = PyModule_GetDict(main);
PyRun_String("a = (1, 2, 3)", Py_single_input, d, d);
PyRun_String("a", Py_single_input, d, d);
Py_Finalize();
}
これは(1, 2, 3)
を表示します。ここでは(簡単にするためにエラーチェックなし)いくつかのサンプルコードです。
- ませんエラー処理およびトレースバックプリント:
は、まだ多くの問題があります。
- インタラクティブ・インタプリタのようなブロック・コマンドのための「増分入力」はありません。入力は完了する必要があります。
- 標準出力に出力します。
- 複数行の入力がある場合、何も出力されません。
実際に対話型インタープリタの動作を簡単に複製することは容易ではありません。だからこそ私の最初の勧告は、あなたのGUIに基本的な端末エミュレータを書くことでした。これはあまり厳しくすべきではありません。
インタープリタをシミュレートする必要があります。入力行を1行ずつ評価し、結果を 'print'してください。 –