为什么 PyRun_String 不评估 bool 文字?

Unc*_*eiv 5 python boolean cpython

我需要从 C++ 评估 Python 表达式。这段代码似乎有效:

PyObject * dict = PyDict_New();
PyObject * val = PyRun_String(expression, Py_eval_input, dict, 0);
Py_DECREF(dict);
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果表达式是“假”的“真”(即 val 为 0 并且 PyErr_Occurred() 返回真),它会失败。我究竟做错了什么?他们不应该分别评估 Py_True 和 Py_False 吗?

joe*_*ker 5

PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);
Run Code Online (Sandbox Code Playgroud)

如果您想要 True 和 False,它们必须位于*globals传递给解释器的字典中。您也许可以通过调用 来解决这个问题PyEval_GetBuiltins

来自Python 2.6源代码:

if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
    if (PyDict_SetItemString(globals, "__builtins__",
                 PyEval_GetBuiltins()) != 0)
        return NULL;
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以PyRun_String("import __builtin__ as __builtins__", globals, locals)在致电之前尝试PyRun_String("True", ...)

您可能会注意到,Python 交互式解释器始终运行模块中的代码__main__,而我们在此并未费心创建这些代码。我不知道你是否需要一个__main__模块,除了有很多脚本包含if __name__ == "__main__".