2012-03-02 18 views
4

私はPythonを埋め込んだ小さなCプログラムを書いています。私はPy_Initialize()とPy_Finalize()を使用して正しく設定しており、PyRun_SimpleStringまたはPyRun_SimpleFileを使用してスクリプトを実行できます。しかし、変数の出力時にPythonのインタプリタの動作をどのように模倣するのか分かりません。具体的に埋め込みPythonインタプリタで変数を表示する

:私のために

a = (1, 2, 3) 
print a 

作品罰金:それはプリントアウト(1、2、3)

しかし:

a = (1, 2, 3) 
a 

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

ありがとうございます!

+0

インタープリタをシミュレートする必要があります。入力行を1行ずつ評価し、結果を 'print'してください。 –

答えて

7

インタプリタインタラクティブループを実行するには、関数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に基本的な端末エミュレータを書くことでした。これはあまり厳しくすべきではありません。

+0

はい、私はこれを試しましたが、何か間違っていない限り、インタラクティブな入力が必要なようでした。私が試したのは: FILE * myfile = fopen( "example.py"、 "r +"); PyRun_InteractiveLoop(myfile、 "example.py"); fclose(myfile); – FizzBuzz

+0

@FizzBu​​zz:ファイルからコマンドを読み込みたいのですが、対話形式で入力したかのように動作させたいのですか?そして、あなたはこれがあなたのユーザーの期待だと主張していますか?私はここで何かが欠けていると確信しています。 –

+0

@FizzBu​​zz: 'PyRun_InteractiveLoop()'に渡すファイルは、リンクされたドキュメントにあるように、 "対話型のデバイスに関連付ける"必要があることに注意してください。 –

関連する問題