(original) (raw)
#include #include const char *py_source = "def fn():\n" " print 'one'\n" " yield 1\n" " print 'two'\n" " yield 2\n" ; const char *wrapper_source1 = "class gwrap:\n" " def __init__(self,gen):\n" " self.gen = gen\n" " def __iter__(self):\n" " return iter(self.gen)\n" ; const char *wrapper_source2 = "def gwrap(gen):\n" " return [i for i in gen]\n" ; const char *wrapper_source3 = "def gwrap(gen):\n" " return (x for x in [i for i in gen])\n" ; const char *wrapper_source4 = "class gwrap:\n" " def __init__(self,gen):\n" " list = [i for i in gen]\n" " self.gen = list.__iter__()\n" " def __iter__(self):\n" " return iter(self.gen)\n" ; const char *wrapper_source5 = "def gwrap(gen):\n" " return (i for i in gen)\n" ; int main (int argc, char *argv[]) { Py_Initialize(); PyObject *main_module = PyImport_AddModule("__main__"); PyObject *globals = PyObject_GetAttrString( main_module, "__dict__"); // insert function code into interpreter PyObject *code = PyRun_String(py_source, Py_file_input, globals, NULL); Py_DECREF(code); // insert wrapper class into interpreter PyObject *code2 = PyRun_String(wrapper_source5, Py_file_input, globals, NULL); Py_DECREF(code2); // compile call to the function code = Py_CompileString("gwrap(fn())", "", Py_eval_input); // code = Py_CompileString("fn()", "", Py_eval_input); // do call PyObject *gen = PyEval_EvalCode((PyCodeObject *)code, globals, NULL); gen = PyObject_GetIter((PyObject *)gen); // iterate result PyObject *item; while ((item = PyIter_Next(gen))) { printf("> %ld\n", PyInt_AsLong(item)); Py_DECREF(item); } Py_DECREF(gen); Py_DECREF(code); Py_DECREF(globals); Py_Finalize(); return 0; }