8

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

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);
}

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

4

1 に答える 1

14

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

この問題についての私の理解は次のとおりです。

  • Py_eval_input組み込みと同等ですeval-式を評価します。
  • Py_file_inputと同等execです-Pythonコードを実行しますが、何も返しません。
  • Py_single_input式を評価し、その値を出力します-インタプリタで使用されます。

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

于 2012-03-08T05:08:56.987 に答える