2009-02-04 101 views
4

我需要从C++评估一个Python表达式。此代码似乎工作:为什么PyRun_String不评估bool文字?

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

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

+0

PyErr_Print()在失败后调用它时会显示什么? – 2009-02-04 16:18:24

+0

我知道,我之前应该做到这一点,但由于多种原因,我无法在应用程序中调用PyErr_Print()。无论如何,我在一个孤立的文件中重现了这一点,这就是我得到的: NameError:name'False'未定义 !!它看起来像这个文字不可用C ...! – UncleZeiv 2009-02-04 17:57:29

回答

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

如果你想要True和False,他们必须在*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__"的脚本。

相关问题