views:

329

answers:

1

I need to evaluate a Python expression from C++. This code seems to work:

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

Unfortunately, it fails horribly if expression is "True" of "False" (that is, val is 0 and PyErr_Occurred() returns true). What am I doing wrong? Shouldn't they evaluate to Py_True and Py_False respectively?

+2  A: 
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);

If you want True and False they will have to be in the *globals dict passed to the interpreter. You might be able to fix that by calling PyEval_GetBuiltins.

From the Python 2.6 source code:

if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
    if (PyDict_SetItemString(globals, "__builtins__",
                 PyEval_GetBuiltins()) != 0)
        return NULL;
}

If that doesn't work, you could try to PyRun_String("import __builtin__ as __builtins__", globals, locals) before calling PyRun_String("True", ...).

You might notice the Python interactive interpreter always runs code in the __main__ module which we haven't bothered to create here. I don't know whether you need to have a __main__ module, except that there are a lot of scripts that contain if __name__ == "__main__".

joeforker
Didn't know this, good answer!
Torsten Marek
wow, I never realized that True, False and even None are part of the __builtin__ module... the first solution did it for me, thank you for pointing me in the right direction! I found some more info here: http://www.python.org/doc/2.3/whatsnew/section-bool.html
UncleZeiv