Fredrik Lundh wrote:
> [EMAIL PROTECTED] wrote:
>
> > But .... I'm suffering from serious scoping bugs.  I hope someone here
> > can help me with them.
> >
> > First of all, if I type in something like;
> >
> > def f(x):
> >      if x==1:
> >           return x
> >      else:
> >           return x * f(x-1)
> >
> > and then go
> > print f(5)
> >
> > I get an error.  It says 'global name 'f' is not defined'.  So
> > recursion won't work because of some odd scoping bug.
>
> looks like the globals are all messed up.  it would help to see the
> actual C code.
>
> </F>

Thanks!

I initialize the interpreter like this:


static PyObject *glb, *loc;

void startPython() {
        Py_Initialize();
        loc = PyDict_New();
        glb = PyDict_New();
        PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ());

        Py_InitModule("myIO", myIOMethods);
        ...... other modules initialization ......

        executeFromResource(IDR_STARTUP_PY);
        ....... other startup scripts ........
}

I pretty much do the same thing for executing text resources or for
interactive commands - (and get the same bug either way) - actual code
from executeFromResource follows ....


int  executeFromResource(int nResourceID) {
        PyObject * src, *exception, *value, *traceback, *object, *result;
.....miscellaneous Win32 stuff to capture resource from ID
.....and to strip out 0x0D characters and add NULL terminator.
.....char *  "no0x0D" points to executable Python text
.....msg is something like <<resource #103>>

        src = Py_CompileString(no0x0D, msg, Py_file_input);

        free(no0x0D);

        if (src != NULL) {
                /* it compiled.  run it! */
                result = PyEval_EvalCode ((PyCodeObject *)src, glb, loc);
                if (PyErr_Occurred()) PyErr_Print();
                Py_XDECREF(result);
                Py_XDECREF(src);
                return 1;
        }
        /*      report whatever error we got */
        if (nResourceID != IDR_STARTUP_PY)
        {
                /*      report it to the console */
                PyErr_Print();
                PyErr_Clear();
        } else {
                /*      if startup script dies, we have no console */
                PyErr_Fetch (&exception, &value, &traceback);
                PyArg_ParseTuple (value, "sO", &msg, &object);
                PyErr_Clear();
                Py_XDECREF (exception);
                Py_XDECREF(value);
                Py_XDECREF(traceback);
                outputLogDialog("Error in Python startup\r\n");
                outputLogDialog(msg);
                outputLogDialog("\r\n");
        }
        return 0;
}

I had figured that referencing PyObject * glb and * loc was sufficient
to provide proper variable scoping.  Am I missing something here?  I
must be.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to