2009-02-04 111 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__"的腳本。