On 24 Ún, 15:25, "Gabriel Genellina" <gagsl-...@yahoo.com.ar> wrote: > En Mon, 23 Feb 2009 05:51:27 -0200, Kom2 <k...@centrum.cz> escribió: > > > > > On 20 Ún, 16:27, Steve Holden <st...@holdenweb.com> wrote: > >> Kom2 wrote: > >> > Hello, > >> > I'm trying to convert my project from python 2.5 to python 3.0 and I > >> > have the following problem. My project is PYD library written in C++. > >> > So I have this PyInit_ModuleName function containing PyModule_Create > >> > call and this function also call some script with declarations: > > >> > PyObject* m; > > >> > m = PyModule_Create(&PyVRDAModule); > >> > if (m == NULL) { > >> > return NULL; > >> > } > >> > PyObject *d, *v; > >> > d = PyModule_GetDict(m); > >> > v = PyRun_StringFlags(txtPyPredefinedConstants), Py_file_input, d, > >> > d, NULL); > >> > ...... > > >> > txtPyPredefinedConstants is string with this content: > > >> > class CursorMoveType: > >> > First = 0 > >> > Last = 1 > >> > Next = 2 > >> > Previous = 3 > >> > Bookmark = 4 > >> > NewRecord = 5 > > >> > In Python 2.5 everything works fine, now in python3.0 > >> > PyRun_StringFlags returns NULL and I get error "__build_class__ not > >> > found". > > __build_class__ is a (hidden?) function in the builtins module. > Your module isn't completely created yet, it lacks the __builtins__ > attribute, so you can't execute any Python code that calls a builtin > function. In 2.5 the class statement was a lot simpler, but in 3.0 it > requires an auxiliary function (implemented as builtins.__build_class__) > You may try setting __builtins__ to the current builtins > (PyEval_GetBuiltins) before executing Python code. > Or, if those 7 lines are all you need, you may just write the equivalent C > code. > > -- > Gabriel Genellina
Thanks for answer, calling PyEval_GetBuiltins could also help. I solved this issue by getting dictionary of __main__ module as global dictionary - d = PyModule_GetDict(m); PyObject* glMod = PyImport_AddModule("__main__"); if (glMod == NULL) { return NULL; } PyObject* glDict = PyModule_GetDict(glMod); v = PyRun_StringFlags(txtPyPredefinedConstants, Py_file_input, glDict, d, NULL); - and it works. -- http://mail.python.org/mailman/listinfo/python-list