This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author terry.reedy
Recipients IrvKalb, ned.deily, terry.reedy
Date 2020-07-28.02:44:29
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1595904269.59.0.561706167779.issue41413@roundup.psfhosted.org>
In-reply-to
Content
Simpler test.

Open IDLE Shell (only) from icon or (preferably) terminal.
>>> input()
   # Close IDLE without giving input with Window (X), File => exit, or Control/Command-Q.
Click OK in "Your program is still running" box (from PyShell)

On Windows, IDLE closes apparently cleanly, but Task Manager shows that (at least usually) the IDLE process moves from Apps to Background processes, with label 'Python x.y.z Shell', where it remains as an inaccessible 20 mb zombie until [End Task]ed.  This is not normal.

On macOS Mohave, the Shell window and IDLE part of the top menubar disappear, but the Apple part remains with the apple and program name entry ("IDLE" or "Python" depending on whether started from icon or Terminal).  I presume this is the equivalent of Python becoming a background process, except that Apple keeps a visible link to it.  If I start IDLE in Terminal with trailing &, there are initially two processes, and the first remains along with the Apple menu.

Under the IDLE/Python menu item, About and Preferences still bring up the corresponding dialogs, which worked as far as I tested.  This confirms that the IDLE process is still alive. A couple of times, Quit (Command-Q) worked to quit/crash python, and Segmentation Fault appeared in Terminal once.  Later, Quit did not work and I had to use (apple)=> Force Quit.

The trivial solution is to not close with input pending.  First, either hit Enter to let the user code run or end-of-file (default ^D) to kill it.  A corresponding patch could enforce this with a message to enter or kill before closing.

However, I believe the issue is that PyShell.readline uses a nested tk mainloop() as a control mechanism.  Four callbacks, including eof_callback, call quit() to exit the nested mainloop and finish readline.  But the callback has to finish and be pulled off the stack first.  Three of the callbacks return immediately after 'quit()'.  However, PyShell.close continues closing before readline continues.

When I replaced pyshell line  1016
        return EditorWindow.close(self)
with
        root.after(1, EditorWindow.close self)
the bug disappears.  The opens a time gap between PyShell.close and EditorWindow.close that allows readline to return '', signalling end-of-file.

This change also works on my Mac, except that I have to say 'yes' twice to close.
Irv, please try this replacement on your system.
History
Date User Action Args
2020-07-28 02:44:29terry.reedysetrecipients: + terry.reedy, ned.deily, IrvKalb
2020-07-28 02:44:29terry.reedysetmessageid: <1595904269.59.0.561706167779.issue41413@roundup.psfhosted.org>
2020-07-28 02:44:29terry.reedylinkissue41413 messages
2020-07-28 02:44:29terry.reedycreate