Hi Fernando,<br><br>The exception you're seeing is a different one, however. In fact, input was a bad example: the difference can be better seen with str("something"). The attached test file runs under python 2.6, but shows a NameError in ipython.<br>

<br>The relevant code is already being called from an atexit callback. Specifically, it triggers the .reset() method of the TerminalInteractiveShell object. You can verify this with the following code in ipython trunk:<br>

<br>class A(object):<br>    def __del__(self):<br>        str("Hi")<br>a = A()<br>get_ipython().reset()<br># Gives: Exception NameError: "global name 'str' is not defined" in <bound method A.__del__ of <__main__.A object at 0x985004c>> ignored<br>

<br>Thanks,<br>Thomas<br><br><div class="gmail_quote">On 9 October 2010 20:31, Fernando Perez <span dir="ltr"><<a href="http://fperez.net">fperez.net</a>@<a href="http://gmail.com">gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

Hi Thomas,<br>
<div><div></div><div class="h5"><br>
On Sat, Oct 9, 2010 at 9:45 AM, Thomas Kluyver <<a href="mailto:takowl@gmail.com">takowl@gmail.com</a>> wrote:<br>
> I recently found a problem in my python 3 port of ipython, where the __del__<br>
> method of objects, called as the program was exiting, could not find global<br>
> functions.<br>
><br>
> On a hunch, I've just tested this in standard ipython, both 0.10 (in Ubuntu)<br>
> and trunk. The problem exists in both cases (it only came to light in Python<br>
> 3 because print is a function). The minimal code to reproduce it is:<br>
><br>
> class A(object):<br>
>     def __del__(self):<br>
>         input("ABC")<br>
><br>
> a = A()<br>
> exit()<br>
><br>
> Which gives: Exception NameError: "global name 'input' is not defined" in<br>
> <bound method A.__del__ of <__main__.A object at 0x98634cc>> ignored<br>
<br>
</div></div>This isn't an ipython bug, but a reality of python itself:<br>
<br>
dreamweaver[test]> cat objdel.py<br>
<div class="im">class A(object):<br>
    def __del__(self):<br>
        input("ABC")<br>
<br>
a = A()<br>
exit()<br>
</div>dreamweaver[test]> python objdel.py<br>
Exception ValueError: 'I/O operation on closed file' in <bound method<br>
A.__del__ of <__main__.A object at 0x7f47551bcf50>> ignored<br>
ABCdreamweaver[test]><br>
<br>
Basically, on exit the sate of the interpreter is mostly undefined.<br>
Del methods should limit themselves to closing resources they had<br>
acquired:<br>
<br>
self.whatever.close()<br>
<br>
But they can't expect to access any globals, or even objects in other modules.<br>
<br>
If you need to perform actions on exit but that require the<br>
interpreter to be fully functional, use the atexit module and register<br>
your callbacks (ipython uses that).<br>
<br>
Cheers,<br>
<font color="#888888"><br>
f<br>
</font></blockquote></div><br>