2012-03-05 11 views
5

Estoy tratando de encontrar la manera de usar el intérprete de Python de C, y estoy teniendo problemas con PyEval_EvalCode. Básicamente, estoy escribiendo una función C que toma una cadena arbitraria de código Python, la compila, la ejecuta y luego imprime el resultado.Python C API: Usando PyEval_EvalCode

El problema es que cuando imprimo el resultado, siempre obtengo None, incluso si la expresión obviamente no se evalúa a None.

Aquí está el código (con comprobación de errores y el recuento de referencias para mayor claridad):

void eval(const char* s) 
{ 
    PyCodeObject* code = (PyCodeObject*) Py_CompileString(s, "test", Py_file_input); 
    PyObject* main_module = PyImport_AddModule("__main__"); 
    PyObject* global_dict = PyModule_GetDict(main_module); 
    PyObject* local_dict = PyDict_New(); 
    PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); 

    PyObject* result = PyObject_Str(obj); 
    PyObject_Print(result, stdout, 0); 
} 

Traté de llamar a esta función con "5 + 5" como la entrada, y se visualiza None. ¿Estoy usando PyEval_EvalCode incorrectamente?

Respuesta

7

Si desea evaluar una expresión, necesita usar Py_eval_input como argumento para Py_CompileString.

Mi comprensión de la cuestión es que:

  • Py_eval_input es equivalente a la incorporada en el eval - se evalúa una expresión.
  • Py_file_input es equivalente a exec - Ejecuta el código de Python, pero no devuelve nada.
  • Py_single_input evalúa una expresión e imprime su valor: se usa en el intérprete.

Para más información, consulte here, pero la documentación sobre este tema es débil.