2009-02-04 3 views
4

C++에서 파이썬 표현식을 평가해야합니다. 이 코드는 작동하는 것 같다 :PyRun_String이 bool 리터럴을 평가하지 않는 이유는 무엇입니까?

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

불행히도, 표현 (즉, 발은 0입니다 및 PyErr_Occurred()가 true를 돌려) "거짓"의 "참"인 경우 끔찍하게 실패합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 그들은 각각 Py_True와 Py_False로 평가해서는 안됩니까? 당신이 True와 False하려면

+0

오류 발생 후 PyErr_Print()가 호출 할 때 표시되는 점은 무엇입니까? –

+0

필자는 이전에이 작업을 수행 했어야했지만 PyErr_Print()를 여러 가지 이유로 응용 프로그램에서 호출 할 수는 없습니다. 어쨌든, 이것을 고립 된 파일로 재현했는데 이것이 내가 가지고있는 것입니다 : NameError : name 'False'가 정의되지 않았습니다 !! 이 리터럴이 C에서 사용할 수없는 것 같습니다 ...! – UncleZeiv

+0

질문에 대한 답변이므로 답변으로 게시해야합니다. –

답변

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

그들은 인터프리터에 전달 된 *globals DICT에 있어야합니다. PyEval_GetBuiltins으로 전화하여 문제를 해결할 수 있습니다. 파이썬 2.6 소스 코드에서

: 문제가 해결되지 않으면

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

, 당신은 PyRun_String("True", ...)를 호출하기 전에 PyRun_String("import __builtin__ as __builtins__", globals, locals)에 시도 할 수 있습니다.

파이썬 인터프리터 인터프리터는 우리가 여기서 만들지 못한 __main__ 모듈에서 항상 코드를 실행한다는 것을 알 수 있습니다. __main__ 모듈이 필요한지는 알지 못하지만, if __name__ == "__main__"을 포함하는 많은 스크립트가 있다는 점만 다릅니다.

+0

잘 모르겠습니다. –

+0

와우, 나는 진실하고 틀림 없음을 깨닫지 못했습니다. 심지어 아무도 __builtin__ 모듈의 일부가 아닙니다. 첫 번째 해결책은 저에게 해 주셨습니다. 올바른 방향으로 나를 가르쳐 주셔서 감사합니다! 여기에 더 많은 정보가 있습니다 : http://www.python.org/doc/2.3/whatsnew/section-bool.html – UncleZeiv

관련 문제