Python C API: использование PyEval_EvalCode

Я пытаюсь понять, как использовать интерпретатор Python из C, и у меня проблемы с PyEval_EvalCode. По сути, я пишу функцию C, которая принимает произвольную строку кода Python, компилирует ее, выполняет и затем выводит результат.

Проблема в том, что когда я распечатываю результат, я всегда получаю 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?


person Channel72    schedule 05.03.2012    source источник
comment
Нужно ли нам вставлять некоторые операторы Py_INCREF()/Py_DECREF() в приведенный выше код, чтобы избежать утечек памяти?   -  person BrunoLevy    schedule 28.07.2018


Ответы (1)


Если вы хотите оценить выражение, вам нужно использовать Py_eval_input в качестве аргумента для Py_CompileString.

Мое понимание этого вопроса таково:

  • Py_eval_input эквивалентен встроенному eval -- он вычисляет выражение.
  • Py_file_input эквивалентен exec -- он выполняет код Python, но ничего не возвращает.
  • Py_single_input оценивает выражение и печатает его значение -- используется в интерпретаторе.

Подробнее см. здесь, но документация по этому вопросу слабая.

person sterin    schedule 08.03.2012