2012-03-05 3 views
5

C에서 Python 인터프리터를 사용하는 방법을 알아 내려고하고 있는데 PyEval_EvalCode과 문제가 있습니다. 기본적으로, 임의의 Python 코드 문자열을 받아서 컴파일하고 실행 한 다음 결과를 출력하는 C 함수를 작성하고 있습니다.Python C API : PyEval_EvalCode 사용

문제점은 결과를 인쇄 할 때 표현이 분명히 None이 아니더라도 항상 None이됩니다. 여기

를 (명확성을 위해 제거 된 에러 체킹 및 참조 카운팅) 코드이고 : I는 입력으로 "5 + 5"이 함수를 호출 시도

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

, 그것은 None 표시. PyEval_EvalCode을 잘못 사용하고 있습니까?

답변

7

표현식을 평가하려면 Py_CompileString에 대한 인수로 Py_eval_input을 사용해야합니다.

  • Py_eval_input은 동일합니다 내장 eval - 그것은 표현식을 평가 :

    문제의 나의 이해는 점이다.

  • Py_file_inputexec과 같습니다. - Python 코드를 실행하지만 아무 것도 반환하지 않습니다.
  • Py_single_input은 표현식을 평가하고 인터프리터에서 사용되는 값을 인쇄합니다.

자세한 내용은 here을 참조하십시오. 그러나이 주제에 관한 문서는 약합니다.