2012-05-21 16 views
8

Estoy tratando de insertar un pitón en mi proyecto favorito. He reducido mi problema con el siguiente código:(Python C API) PyRun_StringFlags ¿faltan funciones integradas?

#include <Python.h> 
#include "iostream" 

int main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 

    PyObject *globals = Py_BuildValue("{}"); 
    PyObject *locals = Py_BuildValue("{}"); 

    PyObject *string_result = PyRun_StringFlags(
     "a=5\n" 
     "s='hello'\n" 
     "d=dict()\n" 
     , 
     Py_file_input, globals, locals, NULL); 
    if (PyErr_Occurred()) {PyErr_Print();PyErr_Clear();return 1;} 
    return 0; 
} 

(. Yo sé que no soy la limpieza de todas las referencias Este es un ejemplo.)

puede ser compilado por

c++ $(python-config --includes) $(python-config --libs) test.cpp -o test 

Si lo ejecuto me sale el siguiente error:

$ ./test 
Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
NameError: name 'dict' is not defined 

parece las funciones de la orden interna no se cargan. Tampoco puedo import nada. Me da que __import__ falta. ¿Cómo puedo cargar los módulos faltantes o lo que sea que me falta?

Gracias.

Respuesta

7

Una manera:

g = PyDict_New(); 
if (!g) 
    return NULL; 

PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); 

y luego pasar g como globals.

+0

Gracias! 'PyEval_GetBuiltins' era exactamente lo que necesitaba. Simplemente no sabía cómo encontrarlo. – Simon

4

También puede ejecutar el código dentro del espacio de nombres __main__ módulo:

PyObject *globals = PyModule_GetDict(PyImport_AddModule("__main__")); 
PyObject *obj = PyRun_String("...", Py_file_input, globals, globals); 
Py_DECREF(obj); 

Esto es en realidad lo que hace PyRun_SimpleStringFlags internamente.