我需要从C ++中评估一个Python表达式。这段代码似乎有效:
PyObject * dict = PyDict_New();
PyObject * val = PyRun_String(expression, Py_eval_input, dict, 0);
Py_DECREF(dict);
不幸的是,如果表达式为“False”的“True”(即val为0且PyErr_Occurred()返回true),则会失败。我究竟做错了什么?他们不应该分别评估Py_True和Py_False吗?
答案 0 :(得分:4)
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);
如果你想要正确和错误,他们必须在传递给翻译的*globals
字典中。您可以通过调用PyEval_GetBuiltins
来解决这个问题。
从Python 2.6源代码:
if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
if (PyDict_SetItemString(globals, "__builtins__",
PyEval_GetBuiltins()) != 0)
return NULL;
}
如果这不起作用,您可以在致电PyRun_String("import __builtin__ as __builtins__", globals, locals)
之前尝试PyRun_String("True", ...)
。
您可能会注意到Python交互式解释器始终在__main__
模块中运行代码,我们在这里无需创建。我不知道你是否需要一个__main__
模块,除了有很多脚本包含if __name__ == "__main__"
。