(Python C API) PyRun_StringFlags missing builtin functions?

python, python-c-api, python-embedding

Solution

One way:

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

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

And then pass `g` as `globals`.

Problem

I am trying to embed some python in my pet project. I have reduced my problem to the following code: ``` #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; } ``` (I know I'm not cleaning up any references. This is an example.) it can be compiled by ``` c++ $(python-config --includes) $(python-config --libs) test.cpp -o test ``` If I run it I get the following error: ``` $ ./test Traceback (most recent call last): File "<string>", line 3, in <module> NameError: name 'dict' is not defined ``` It seems the the builtin functions aren't loaded. I also cannot `import` anything. I get that `__import__` is missing. How can I load the missing modules or whatever I am missing? Thanks.

Original source