Python C API: использование PyEval_EvalCode - PullRequest
7 голосов
/ 06 марта 2012

Я пытаюсь понять, как использовать интерпретатор 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?

1 Ответ

10 голосов
/ 08 марта 2012

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

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

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

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

...