2012-03-05 8 views
5

私はCのPythonインタプリタを使用する方法を理解しようとしていますが、私はPyEval_EvalCodeと問題があります。基本的には、Pythonコードの任意の文字列を取り込み、コンパイルして実行し、結果を出力するC関数を作成しています。Python C API:PyEval_EvalCodeを使用して

問題は、私が結果をプリントアウトすると、式が明らかにNoneと評価されなくても、常にNoneになるということです。ここ

が(エラーチェック及び明確化のために除去参照カウントを有する)コードである:

void eval(const char* s) 
{ 
    PyCodeObject* code = (PyCodeObject*) Py_CompileString(s, "test", Py_file_input); 
    PyObject* main_module = PyImport_AddModule("__main__"); 
    PyObject* global_dict = PyModule_GetDict(main_module); 
    PyObject* local_dict = PyDict_New(); 
    PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); 

    PyObject* result = PyObject_Str(obj); 
    PyObject_Print(result, stdout, 0); 
} 

Iは入力として"5 + 5"と、この関数を呼び出す試み、それがNoneを示しました。 PyEval_EvalCodeを間違って使用していますか?

答えて

7

式を評価する場合は、Py_CompileStringの引数としてPy_eval_inputを使用する必要があります。問題の

私の理解では、ということです。

  • Py_eval_input内蔵evalと等価である - それは式を評価します。
  • Py_file_inputexecに相当します。これはPythonコードを実行しますが、何も返しません。
  • Py_single_inputは、式を評価し、その値を出力します - インタープリタで使用されます。

詳細についてはhereを参照してください。ただし、この件に関するドキュメントは弱いです。

関連する問題