Python API, objects, globals, and forking.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • David M. Wilson

    Python API, objects, globals, and forking.

    Hello,

    I have a C program embedding the Python interpreter, and loading a new
    module like so:

    exim_module = PyImport_ExecCo deModule("__exi m__", compiled_module );


    The program then forks a little while later, PyOS_AfterFork( ) gets
    called, and everything appears to be honkey dory. However, given the
    __exim__ module of:

    foo = 1

    def a():
    print foo

    def b():
    print foo


    When the program calls a(), "1" is printed as expected, but on the
    second Python function call, "None" would be printed. Both calls occur
    after the fork. Looking at globals(), all my user objects (foo, etc.)
    are set to None, with the only object remaining untouched being
    __builtins__. Interestingly, even the active function's reference in
    globals() is set to None - suggesting the change occurs after my C
    program does:

    while (...)
    root = PyObject_GetAtt rString(last, pos);
    /* succeeds in looking up the b() function object. */

    ...

    result = PyObject_Call(c allable, py_args, NULL);


    The only other Python API calls I make in between these two are
    PyTuple_New, PyTuple_SET_ITE M, PyObject_DECREF , and
    PyString_FromSt ring.

    Stuffing some user variables into __builtins__ and testing for them
    later appears to work - so it looks like something is specifically
    cleaning out the globals. Can someone shed any light on this?


    David.
Working...