Python C API : Using PyEval_EvalCode

标签 python python-3.x python-c-api python-c-extension

我正在尝试弄清楚如何从 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/

相关文章:

python - Flask 帮助理解多对多关系上的 primaryjoin/secondaryjoin

python - 打印列表返回每个元素的位置,而不是值

python - 替代 Pandas DataFrame 中的嵌套 np.where

python-3.x - 如何为 input() 提供时间窗口,如果不使用则让程序继续运行

c++ - 如何使用 PyObject_CallObject 查询复杂返回类型的数据?

c++ - 如何将 boost python 列表转换为 PyObject

python - fatal error : Python. h:没有这样的文件或目录

python - 从 csv 文件中读取特定值

python - Selenium + Python : How to stop page loading when certain element gets loaded?

python - 如何将夹层安装为 Django 应用程序?