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 吗?
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__".