インタープリターの対話型ループを実行するには、関数を使用する必要がありますPyRun_InteractiveLoop()
。そうしないと、コードはインタラクティブに入力されるのではなく、Pythonスクリプトファイルで記述されたように動作します。
編集:これが単純なインタラクティブインタプリタの完全なコードです:
#include <Python.h>
int main()
{
Py_Initialize();
PyRun_InteractiveLoop(stdin, "<stdin>");
Py_Finalize();
}
Edit2:GUIに完全なインタラクティブインタプリタを実装するのは少しプロジェクトです。おそらく、それを正しく行う最も簡単な方法は、疑似端末デバイスに接続された基本的な端末エミュレーターを作成し、そのデバイスで上記のコードを使用することです。これにより、すべての微妙な点が自動的に正しくなります。
本格的なインタラクティブエディタを目的としない場合は、開始トークンとしてPyRun_String()
withを使用するオプションがあります。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)
。
まだ多くの問題があります:
- エラー処理とトレースバック印刷はありません。
- インタラクティブインタプリタのようなブロックコマンドの「インクリメンタル入力」はありません。入力が完了する必要があります。
- stdoutに出力します。
- 複数行の入力を指定した場合、何も出力されません。
インタラクティブインタプリタの動作を実際に複製することは簡単ではありません。そのため、私の最初の推奨事項は、GUIで基本的なターミナルエミュレーターを作成することでした。これはそれほど難しいことではありません。