4

Python を組み込んだ小さな C プログラムを作成しました。Py_Initialize() と Py_Finalize() を使用して正しく設定しており、PyRun_SimpleString または PyRun_SimpleFile を使用してスクリプトを実行できます。ただし、変数を出力するときに Python 独自のインタープリターの動作をどのように模倣するかはわかりません。

具体的には:

a = (1, 2, 3)
print a

私にとってはうまくいきます:(1、2、3)が出力されます

でも:

a = (1, 2, 3)
a

何も出力しません。Python 独自のインタープリターでは、これは (1, 2, 3) も出力します。ユーザーが期待するようにコードを実行し、値を出力するにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1

7

インタープリターの対話型ループを実行するには、関数を使用する必要があります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で基本的なターミナルエミュレーターを作成することでした。これはそれほど難しいことではありません。

于 2012-03-02T22:43:18.163 に答える