5

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

PyObject * dict = PyDict_New();
PyObject * val = PyRun_String(expression, Py_eval_input, dict, 0);
Py_DECREF(dict);

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

4

1 回答 1

5
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);

如果你想要 True 和 False,它们必须在*globals传递给解释器的 dict 中。你也许可以通过调用来解决这个问题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__".

于 2009-02-04T19:07:32.540 回答