msg155398 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2012-03-11 17:51 |
In PyShell.py, the "readline" method enters a nested event loop for handling input. If the shell is restarted, the nested event loop remains until after the first press of "enter" causes the "enter_callback" to quit the nested event loop. The effect is that the first line of input to the prompt is ignored by the new shell. Attached is a patch against 3.3 to fix the problem. |
|
|
msg185690 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2013-03-31 22:46 |
Closing the shell window while in the nested event loop for readline fails to exit the nested event loop. I updated the title to reflect the broader problem with readline's handling of the nested event loop. The rev1 patch causes the nested event loop to exit when restarting or closing the shell. |
|
|
msg185691 - (view) |
Author: Ned Deily (ned.deily) *  |
Date: 2013-03-31 23:06 |
With the rev1 patch (on OS X), the cursor seems to end up on the wrong line after the restart: >>> import sys >>> sys.stdin.readline() >>> ================================ RESTART ================================ >>> *Cursor left here at (*), i.e. the left margin of the next line, not on the same line as the ">>> " prompt. |
|
|
msg185692 - (view) |
Author: Ned Deily (ned.deily) *  |
Date: 2013-03-31 23:08 |
However, the patch *does* fix the original problem that the first input after restart is skipped. |
|
|
msg185695 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2013-03-31 23:34 |
Ned, I can confirm the behavior you are seeing. I am trying to trace down why this spurious '\n' gets inserted. |
|
|
msg185705 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2013-04-01 03:59 |
I reworked the patch to fix the cursor problem. The new code, hopefully, is simpler to understand and harder to break. Essentially, all code paths that terminate the subprocess must also call stop_readline which exits that nested event loop if needed. |
|
|
msg185712 - (view) |
Author: Ned Deily (ned.deily) *  |
Date: 2013-04-01 05:01 |
With the stop_readline patch, I'm seeing this exception upon shell restart when trying the same test as above: $ ./python -m idlelib Exception in Tkinter callback Traceback (most recent call last): File "Lib/tkinter/__init__.py", line 1475, in __call__ return self.func(*args) File "Lib/idlelib/PyShell.py", line 1225, in restart_shell self.interp.restart_subprocess(with_cwd=True) File "Lib/idlelib/PyShell.py", line 457, in restart_subprocess console.stop_readline() AttributeError: 'PyShell' object has no attribute 'stop_readline' |
|
|
msg185714 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2013-04-01 05:13 |
I just re-applied the patch to a clean 2.7 and 3.4 branch and didn't see that exception raised. Are you sure that the patch applied cleanly? |
|
|
msg185716 - (view) |
Author: Ned Deily (ned.deily) *  |
Date: 2013-04-01 05:30 |
Ah, sorry, I mis-edited the patch when check_whitespace.py complained about a whitespace problem. The test does now work correctly, thanks. |
|
|
msg185884 - (view) |
Author: Roger Serwy (roger.serwy) *  |
Date: 2013-04-03 04:13 |
Ned, I was reading the dev guide more closely about the meaning of the "commit review" stage. Would it be ok to place this issue into that stage with your test result? |
|
|
msg185885 - (view) |
Author: Ned Deily (ned.deily) *  |
Date: 2013-04-03 04:16 |
Sure, or just go ahead and commit it. LGTM. |
|
|
msg185890 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2013-04-03 05:44 |
New changeset 097554712637 by Roger Serwy in branch '2.7': #14254: IDLE now handles readline correctly across shell restarts. http://hg.python.org/cpython/rev/097554712637 New changeset 0be85a7fc839 by Roger Serwy in branch '3.3': #14254: IDLE now handles readline correctly across shell restarts. http://hg.python.org/cpython/rev/0be85a7fc839 New changeset 4b4f142befea by Roger Serwy in branch 'default': #14254: merge with 3.3. http://hg.python.org/cpython/rev/4b4f142befea |
|
|