Running script in module initialization

Kom2 kom2 at centrum.cz
Wed Feb 25 02:50:27 EST 2009


On 24 Ún, 15:25, "Gabriel Genellina" <gagsl-... at yahoo.com.ar> wrote:
> En Mon, 23 Feb 2009 05:51:27 -0200, Kom2 <k... at centrum.cz> escribió:
>
>
>
> > On 20 Ún, 16:27, Steve Holden <st... at 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.



More information about the Python-list mailing list