2012-03-05 13 views
5

Próbuję dowiedzieć się, jak korzystać z interpretera Pythona z C, i mam problem z PyEval_EvalCode. Zasadniczo piszę funkcję C, która przyjmuje dowolny ciąg kodu Pythona, kompiluje go, wykonuje go, a następnie drukuje wynik.Python C API: Używanie PyEval_EvalCode

Problem polega na tym, że po wydrukowaniu wyniku zawsze otrzymuję None, nawet jeśli wyrażenie oczywiście nie jest zgodne z None.

Oto kod (z sprawdzanie błędów i liczenia odniesienia usunięte dla jasności):

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

Próbowałem wywołującego tę funkcję z "5 + 5" jako wejście, a wyświetlany None. Czy nieprawidłowo używam PyEval_EvalCode?

Odpowiedz

7

Jeśli chcesz przetestować wyrażenie, musisz użyć Py_eval_input jako argumentu dla Py_CompileString.

Moje zrozumienie tej sprawy jest to, że:

  • Py_eval_input odpowiada wbudowany eval - ocenia wyrażenia.
  • Py_file_input jest odpowiednikiem exec - Wykonuje kod Pythona, ale niczego nie zwraca.
  • Py_single_input oblicza wyrażenie i drukuje jego wartość - używane w tłumaczu.

Więcej informacji na stronie here, ale dokumentacja na ten temat jest słaba.