Почему PyRun_String не оценивает литералы bool? - PullRequest
4 голосов
/ 04 февраля 2009

Мне нужно оценить выражение Python из C ++. Кажется, этот код работает:

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

К сожалению, это ужасно дает сбой, если выражение имеет значение «True» или «False» (то есть val равно 0 и PyErr_Occurred () возвращает true). Что я делаю неправильно? Разве они не должны оценивать Py_True и Py_False соответственно?

1 Ответ

4 голосов
/ 04 февраля 2009
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals);

Если вы хотите, чтобы Истина и Ложь, они должны быть в соответствии с указанием *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__".

...