2009-02-04 5 views
4

Мне нужно оценить выражение Python из C++. Этот код, кажется, работает:Почему PyRun_String не оценивает литералы bool?

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

К сожалению, она не ужасно, если выражение "True" в "False" (то есть, Допустимы 0 и PyErr_Occurred() возвращает истину). Что я делаю не так? Разве они не должны оценивать Py_True и Py_False соответственно?

+0

Что показывает PyErr_Print(), когда вы вызываете его после сбоя? –

+0

Я знаю, я должен был сделать это раньше, но я не могу назвать PyErr_Print() в моем приложении по ряду причин. Во всяком случае, я воспроизвел это в изолированном файле, и это то, что я получил: NameError: имя 'False' не определено !! Похоже, этот литерал недоступен из C ...! – UncleZeiv

+0

Так как это отвечает на ваш вопрос, вы должны отправить его в качестве ответа. –

ответ

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

Если вы хотите истины и лжи, они должны быть в *globals Словаре передается интерпретатору. Возможно, вы сможете исправить это, вызвав PyEval_GetBuiltins.

Из 2,6 исходного кода Python:

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__".

+0

Не знал этого, хороший ответ! –

+0

wow, я никогда не понимал, что True, False и даже None являются частью модуля __builtin__ ... первое решение сделало это для меня, спасибо, что указали мне в правильном направлении! Я нашел дополнительную информацию здесь: http://www.python.org/doc/2.3/whatsnew/section-bool.html – UncleZeiv

Смежные вопросы