From 012b69cb30761f500103ec66cb8f8229ca017a94 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Tue, 16 Jul 2002 19:30:59 +0000 Subject: [PATCH] The atexit module effectively turned itself off if sys.exitfunc already existed at the time atexit first got imported. That's a bug, and this fixes it. Also reworked test_atexit.py to test for this too, and to stop using an "expected output" file, and to test what actually happens at exit instead of just simulating what it thinks atexit will do at exit. Bugfix candidate, but it's messy so I'll backport to 2.2 myself. --- Lib/atexit.py | 14 ++++----- Lib/test/output/test_atexit | 4 --- Lib/test/test_atexit.py | 59 ++++++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 24 deletions(-) delete mode 100644 Lib/test/output/test_atexit diff --git a/Lib/atexit.py b/Lib/atexit.py index 61f2458dd0a..b5929fc15af 100644 --- a/Lib/atexit.py +++ b/Lib/atexit.py @@ -29,15 +29,11 @@ def register(func, *targs, **kargs): _exithandlers.append((func, targs, kargs)) import sys -try: - x = sys.exitfunc -except AttributeError: - sys.exitfunc = _run_exitfuncs -else: - # if x isn't our own exit func executive, assume it's another - # registered exit function - append it to our list... - if x != _run_exitfuncs: - register(x) +if hasattr(sys, "exitfunc"): + # Assume it's another registered exit function - append it to our list + register(sys.exitfunc) +sys.exitfunc = _run_exitfuncs + del sys if __name__ == "__main__": diff --git a/Lib/test/output/test_atexit b/Lib/test/output/test_atexit deleted file mode 100644 index 1cc01defa55..00000000000 --- a/Lib/test/output/test_atexit +++ /dev/null @@ -1,4 +0,0 @@ -test_atexit -handler2 (7,) {'kw': 'abc'} -handler2 () {} -handler1 diff --git a/Lib/test/test_atexit.py b/Lib/test/test_atexit.py index 517610b235b..07f5a7e80a9 100644 --- a/Lib/test/test_atexit.py +++ b/Lib/test/test_atexit.py @@ -1,5 +1,9 @@ -# Test the exit module -from test_support import verbose +# Test the atexit module. +from test_support import TESTFN, vereq +import atexit +import os + +input = """\ import atexit def handler1(): @@ -8,17 +12,50 @@ def handler1(): def handler2(*args, **kargs): print "handler2", args, kargs -# save any exit functions that may have been registered as part of the -# test framework -_exithandlers = atexit._exithandlers -atexit._exithandlers = [] - atexit.register(handler1) atexit.register(handler2) atexit.register(handler2, 7, kw="abc") +""" -# simulate exit behavior by calling atexit._run_exitfuncs directly... -atexit._run_exitfuncs() +fname = TESTFN + ".py" +f = file(fname, "w") +f.write(input) +f.close() -# restore exit handlers -atexit._exithandlers = _exithandlers +p = os.popen("python " + fname) +output = p.read() +p.close() +vereq(output, """\ +handler2 (7,) {'kw': 'abc'} +handler2 () {} +handler1 +""") + +input = """\ +def direct(): + print "direct exit" + +import sys +sys.exitfunc = direct + +# Make sure atexit doesn't drop +def indirect(): + print "indirect exit" + +import atexit +atexit.register(indirect) +""" + +f = file(fname, "w") +f.write(input) +f.close() + +p = os.popen("python " + fname) +output = p.read() +p.close() +vereq(output, """\ +indirect exit +direct exit +""") + +os.unlink(fname)