8

我试图弄清楚如何从 C 中使用 Python 解释器,但我遇到了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不正确吗?

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 回答