[Python-Dev] More fun with Python shutdown
tim.one at comcast.net
Mon Nov 10 21:48:50 EST 2003
Jim (Fulton) refactored oodles of Zope3 to make heavier use of weak
references. Now Zope3 dies with a segfault when it's shut down, which makes
its adoption of Python 2.3.2 a bit less attractive <wink>.
The problem isn't really understood. I hope that once it is, there will be
a simple way to avoid it under 2.3.2. Jim filed a bug report with a fix to
the symptom here:
It's another case where things go crazy during the second call of
PyGC_Collect in Py_Finalize. Alas, we haven't found a simpler failing test
case than "Zope3" yet.
For bafflement value, I'll give a cmdline-parameterized snippet here that
displays at least 4 distinct behaviors at shutdown, although a segfault
isn't one of them:
def hi(self, w=os.write):
w(1, 'hi 1\n')
print 'hi 2'
exec "import %s as somemodule" % sys.argv in globals()
somemodule.c1 = C()
somemodule.awr = weakref.ref(somemodule.c1, lambda ignore, pp=pp: pp())
del C, pp
Here are the ways it behaves (on Windows, anyway):
C:\Code\python\PCbuild>python temp4.py tempfile
C:\Code\python\PCbuild>python temp4.py math # curiously, __main__ the same
C:\Code\python\PCbuild>python temp4.py __builtin__
C:\Code\python\PCbuild>python temp4.py sys
Exception exceptions.AttributeError: "'NoneType' object has no attribute
'write'" in <function <lambda> at 0x006B6C70> ignored
The only one I can't make any sense of is __builtin__: the weakref callback
is certainly invoked then, but its print statement neither produces output
nor raises an exception.
Note that the exception in the "sys" example has nothing to do with the
"os.write" default-arg value. That's really the print statement,
complaining because sys.stdout is None by the time shutdown gets there.
More information about the Python-Dev