为什么PyRun_String不评估bool文字?

时间:2009-02-04 16:10:15

标签: python boolean cpython

我需要从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吗?

1 个答案:

答案 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__"