Python C API:使用PyEval_EvalCode

Cha*_*l72 7 python python-c-api python-c-extension python-3.x

我正试图弄清楚如何使用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);
}
Run Code Online (Sandbox Code Playgroud)

我尝试将此函数"5 + 5"作为输入调用,并显示None.我使用PyEval_EvalCode不正确吗?

ste*_*rin 10

如果要评估表达式,则需要将其Py_eval_input用作参数Py_CompileString.

我对此事的理解是:

  • Py_eval_input等价于内置eval- 它评估表达式.
  • Py_file_input相当于exec- 它执行Python代码,但不返回任何内容.
  • Py_single_input 计算表达式并打印其值 - 在解释器中使用.

请参阅此处了解更多信息,但有关此主题的文档很薄弱.