IDLE implicitly runs a script as if you specified "-i" when using regular python from the command line. Perhaps this behavior needs to be documented.

For what it's worth, this would make the exitfuncs run on the 3.x series:

diff -r be8e6b81284e Lib/idlelib/run.py
--- a/Lib/idlelib/run.py        Wed Jan 09 19:00:26 2013 +0100
+++ b/Lib/idlelib/run.py        Thu Jan 17 00:41:22 2013 -0600
@@ -381,6 +381,8 @@
             if jit:
                 self.rpchandler.interp.open_remote_stack_viewer()
         else:
+            import atexit
+            atexit._run_exitfuncs()
             flush_stdout()

     def interrupt_the_server(self):



On 01/16/2013 08:47 PM, Steve Spicklemire wrote:
So how dumb is this? For what it's worth... it works for me.

-steve

aluminum:idlelib steve$ diff -C3  run_orig.py run_new.py
*** run_orig.py  2013-01-16 15:31:08.000000000 -0700
--- run_new.py   2013-01-16 15:30:47.000000000 -0700
***************
*** 308,313 ****
--- 308,316 ----
               if jit:
                   self.rpchandler.interp.open_remote_stack_viewer()
           else:
+             if hasattr(sys,'exitfunc') and sys.exitfunc:
+                 sys.exitfunc()
+
               flush_stdout()
def interrupt_the_server(self):


On Jan 16, 2013, at 9:17 AM, Roger Serwy wrote:

Hi Steve,

IDLE's subprocess never actually exits, so the atexit handler will not be 
called. Forcing an exit with sys.exit() will be caught and the subprocess will 
still not exit.

I suggest filing a bug at bugs.python.org.

- Roger


On 01/16/2013 06:50 AM, Steve Spicklemire wrote:
Hello Idle-dev folks,

I tried this on the python list, with no luck. ;-(

I hate to bother you with a basic user question, but I'm not sure where else to 
go. Is there a better list for this?

thanks,
-steve

Begin forwarded message:

From: Steve Spicklemire <[email protected]>
Subject: atexit handler in IDLE?
Date: January 15, 2013 5:25:34 AM MST
To: [email protected]
Cc: Steve Spicklemire <[email protected]>

Hello Pythonistas!

I'm trying to get this program, which works on the command line, to run 
correctly in the IDLE environment:

import atexit

print "This is my program"

def exit_func():
    print "OK.. that's all folks!"

atexit.register(exit_func)

print "Program is ending..."


When I run this on the command line I see:

This is my program
Program is ending...
OK.. that's all folks!

When I run this in IDLE I see:

This is my program
Program is ending...

But the atexit handler is never called. ;-(

I tried to fish through the IDLE source to see how the program is actually 
called, and I decided it looked like it was being invoked with with os.spawnv, 
but I'm not sure why this would defeat the atexit handler. Anybody know? I'd 
like to register such a function in my module, but I need it to work in IDLE so 
that students can easily use it.

thanks!
-steve



_______________________________________________
IDLE-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/idle-dev
_______________________________________________
IDLE-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/idle-dev

_______________________________________________
IDLE-dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/idle-dev

Reply via email to