The atexit module effectively turned itself off if sys.exitfunc already
authorTim Peters <tim.peters@gmail.com>
Tue, 16 Jul 2002 19:30:59 +0000 (19:30 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 16 Jul 2002 19:30:59 +0000 (19:30 +0000)
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
Lib/test/output/test_atexit [deleted file]
Lib/test/test_atexit.py

index 61f2458dd0a429b653ac3546a6053fe80e36c402..b5929fc15af27f81fba0e756d967c966bea130c7 100644 (file)
@@ -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 (file)
index 1cc01de..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-test_atexit
-handler2 (7,) {'kw': 'abc'}
-handler2 () {}
-handler1
index 517610b235b4e0393957b1023feec8272c53249e..07f5a7e80a98e3f041640014d90b796098a427a2 100644 (file)
@@ -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")
+"""
+
+fname = TESTFN + ".py"
+f = file(fname, "w")
+f.write(input)
+f.close()
+
+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()
 
-# simulate exit behavior by calling atexit._run_exitfuncs directly...
-atexit._run_exitfuncs()
+p = os.popen("python " + fname)
+output = p.read()
+p.close()
+vereq(output, """\
+indirect exit
+direct exit
+""")
 
-# restore exit handlers
-atexit._exithandlers = _exithandlers
+os.unlink(fname)