我正在尝试弄清楚如何从 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
?
最佳答案
如果你想计算一个表达式,你需要使用 Py_eval_input
作为 Py_CompileString
的参数。
我对此事的理解是:
Py_eval_input
等同于内置的eval
-- 它计算一个表达式。Py_file_input
等同于exec
-- 它执行 Python 代码,但不返回任何内容。Py_single_input
计算一个表达式并打印它的值 -- 在解释器中使用。
参见 here更多信息,但有关此主题的文档很薄弱。
关于Python C API : Using PyEval_EvalCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573422/