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.
Created on 2007年09月24日 10:48 by Rebecca, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| clear_eof.patch | vstinner, 2011年05月10日 01:06 | |||
| Messages (17) | |||
|---|---|---|---|
| msg56109 - (view) | Author: Rebecca Breu (Rebecca) | Date: 2007年09月24日 10:48 | |
Run the program:
while True:
try:
s = raw_input('> ')
except:
pass
Press Ctrl-D and then Ctrl-C, and you get
Traceback (most recent call last):
File "test.py", line 5, in ?
s = raw_input('> ')
KeyboardInterrupt
Pressing just Ctrl-D or Ctrl-C continues the loop as expected, Ctrl-D
after Ctrl-C works, too. Only Ctrl-C after Ctrl-D sucks, even when you
try to catch "EOFError" and "KeybordInterrupt" explicitly.
The problem occurs with Python 2.4 and 2.5 on Debian testing, friends
confirmed the error under Ubuntu/2.5 and Gentoo/?.
The error does not occur when you import readline first.
Ah, and by the way: http://docs.python.org/lib/reporting-bugs.html
still links to the sourceforce bucktracker.
|
|||
| msg56112 - (view) | Author: Georg Brandl (georg.brandl) * (Python committer) | Date: 2007年09月24日 14:49 | |
There are a few other issues about raw_input and signals in the tracker, possibly this is just another incarnation... The docs tracker link is fixed, but needs a rebuild on the server. |
|||
| msg59242 - (view) | Author: Ralf Schmitt (schmir) | Date: 2008年01月04日 17:19 | |
The following patch fixes it. The end-of-file indicator is still set, fgets returns NULL when ctrl-c is pressed, and the code checks for feof(fp) which is true. PyErr_CheckSignals() isn't called. This patch calls clearerr on the filepointer and consequently after ctrl-c feof(fp) is false and PyErr_CheckSignals is called. What I don't understand is why the backtrace says the KeyboardInterrupt happens in raw_input. PyErr_CheckSignals must be called on the "pass" statement otherwise something would be fundamentally broken (But I guess then python somehow saves the last real bytecode command). ~/Python-2.5.1/ hg diff diff --git a/Parser/myreadline.c b/Parser/myreadline.c --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -44,6 +44,7 @@ my_fgets(char *buf, int len, FILE *fp) if (PyOS_InputHook != NULL) (void)(PyOS_InputHook)(); errno = 0; + clearerr(fp); p = fgets(buf, len, fp); if (p != NULL) return 0; /* No error */ |
|||
| msg87647 - (view) | Author: Daniel Diniz (ajaksu2) * (Python triager) | Date: 2009年05月12日 17:52 | |
Confirmed in trunk, doesn't seem to affect py3k. |
|||
| msg116777 - (view) | Author: Mark Lawrence (BreamoreBoy) * | Date: 2010年09月18日 13:46 | |
There's a one line patch in msg59242, could someone please take a look. Apparantly py3k is not affected by this issue although I haven't tried it myself. |
|||
| msg120899 - (view) | Author: Vetoshkin Nikita (nvetoshkin) | Date: 2010年11月09日 20:40 | |
Confirming that issue is present in latest svn checkout and Ralf's fix helps. |
|||
| msg131280 - (view) | Author: Vetoshkin Nikita (nvetoshkin) | Date: 2011年03月17日 19:34 | |
up! |
|||
| msg131323 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年03月18日 09:58 | |
Instead of always calling clearerr(), we can only call it on EOF: diff -r 88fe1ac48460 Parser/myreadline.c --- a/Parser/myreadline.c Mon Mar 07 08:31:52 2011 +0100 +++ b/Parser/myreadline.c Fri Mar 18 10:57:23 2011 +0100 @@ -72,6 +72,7 @@ } #endif /* MS_WINDOWS */ if (feof(fp)) { + clearerr(fp); return -1; /* EOF */ } #ifdef EINTR This patch works around this issue. |
|||
| msg135659 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年05月09日 22:21 | |
New changeset fa3227c3cf87 by Victor Stinner in branch '3.1': Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c, http://hg.python.org/cpython/rev/fa3227c3cf87 New changeset b5914bfb4d04 by Victor Stinner in branch '3.2': Issue #1195: Fix input() if it is interrupted by CTRL+d and then CTRL+c, clear http://hg.python.org/cpython/rev/b5914bfb4d04 New changeset 3ff5d28ab630 by Victor Stinner in branch 'default': (Merge 3.2) Issue #1195: Fix input() if it is interrupted by CTRL+d and then http://hg.python.org/cpython/rev/3ff5d28ab630 |
|||
| msg135660 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年05月09日 22:23 | |
New changeset c9f07c69b138 by Victor Stinner in branch '2.7': (Merge 3.1) Issue #1195: Fix input() if it is interrupted by CTRL+d and then http://hg.python.org/cpython/rev/c9f07c69b138 |
|||
| msg135661 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年05月09日 22:24 | |
It should be fixed. Reopen the issue if it doesn't work, I only tested on Linux. |
|||
| msg135671 - (view) | Author: Ralf Schmitt (schmir) | Date: 2011年05月10日 00:03 | |
The patch still does not handle the case where the eof indicator is already set when calling raw_input. My original patch does.
Run the following program and hit ctrl-d, then ctrl-c:
import sys
sys.stdin.read()
while True:
try:
s = raw_input('> ')
except:
pass
|
|||
| msg135672 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年05月10日 01:06 | |
> The patch still does not handle the case where the eof indicator > is already set when calling raw_input. My original patch does. Correct, your example fails, but only in Python 2.7. I don't like the idea of always clearing errors. I prefer to reset stdin only after an error or EOF. Attached patch changes file.read() to clear the EOF flag if the read was stopped because of the EOF. |
|||
| msg135693 - (view) | Author: Ralf Schmitt (schmir) | Date: 2011年05月10日 09:30 | |
Either you clearerr or you can't rely on feof. fgets might also set the end of file indicator *and* return valid data. I don't see a reason to not call clearerr right before trying to read from the stream. |
|||
| msg137335 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年05月30日 21:48 | |
Ooops, I specified the wrong issue number in my commits :-/ New changeset 3b1b06570cf9 by Victor Stinner in branch '2.7': Issue #12016: my_fgets() now always clears errors before calling fgets(). Fix http://hg.python.org/cpython/rev/3b1b06570cf9 New changeset de07f90ef45c by Victor Stinner in branch '3.2': Issue #12016: my_fgets() now always clears errors before calling fgets(). Fix http://hg.python.org/cpython/rev/de07f90ef45c New changeset deb6e7859211 by Victor Stinner in branch 'default': (Merge 3.2) Issue #12016: my_fgets() now always clears errors before calling http://hg.python.org/cpython/rev/deb6e7859211 |
|||
| msg137336 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2011年05月30日 21:50 | |
New changeset b40dac6390a9 by Victor Stinner in branch '2.7': Issue #1195: fix the issue number of the NEWS entry http://hg.python.org/cpython/rev/b40dac6390a9 New changeset d780ca579e6f by Victor Stinner in branch '3.2': Issue #1195: fix the issue number of the NEWS entry http://hg.python.org/cpython/rev/d780ca579e6f New changeset 29e61c4ba59f by Victor Stinner in branch 'default': (Merge 3.2) Issue #1195: fix the issue number of the NEWS entry http://hg.python.org/cpython/rev/29e61c4ba59f |
|||
| msg137337 - (view) | Author: STINNER Victor (vstinner) * (Python committer) | Date: 2011年05月30日 21:51 | |
> The patch still does not handle the case where the eof indicator > is already set when calling raw_input. My original patch does. I commited your original patch but I kept mine because it doesn't hurt to clear the error on EOF at exit. Reopen the issue if it still doesn't work in all cases. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:27 | admin | set | github: 45536 |
| 2011年05月30日 21:51:50 | vstinner | set | status: open -> closed resolution: fixed messages: + msg137337 |
| 2011年05月30日 21:50:43 | python-dev | set | messages: + msg137336 |
| 2011年05月30日 21:48:37 | vstinner | set | messages: + msg137335 |
| 2011年05月30日 08:54:54 | vstinner | set | status: closed -> open resolution: fixed -> (no value) |
| 2011年05月10日 09:30:03 | schmir | set | messages: + msg135693 |
| 2011年05月10日 01:06:33 | vstinner | set | files:
+ clear_eof.patch messages: + msg135672 |
| 2011年05月10日 00:03:55 | schmir | set | messages: + msg135671 |
| 2011年05月09日 22:24:35 | vstinner | set | status: open -> closed resolution: fixed messages: + msg135661 |
| 2011年05月09日 22:23:28 | python-dev | set | messages: + msg135660 |
| 2011年05月09日 22:21:50 | python-dev | set | nosy:
+ python-dev messages: + msg135659 |
| 2011年03月18日 09:58:15 | vstinner | set | nosy:
georg.brandl, pitrou, falsetru, vstinner, ajaksu2, schmir, Rebecca, nvetoshkin, Finkregh messages: + msg131323 |
| 2011年03月17日 23:51:21 | eric.araujo | set | nosy:
+ vstinner, - BreamoreBoy versions: + Python 3.1, Python 3.2, Python 3.3 |
| 2011年03月17日 19:34:02 | nvetoshkin | set | nosy:
georg.brandl, pitrou, falsetru, ajaksu2, schmir, Rebecca, nvetoshkin, BreamoreBoy, Finkregh messages: + msg131280 |
| 2010年12月17日 09:21:42 | Finkregh | set | nosy:
+ Finkregh |
| 2010年11月09日 20:40:52 | nvetoshkin | set | nosy:
+ nvetoshkin messages: + msg120899 |
| 2010年11月08日 16:16:37 | eric.araujo | set | nosy:
+ pitrou |
| 2010年11月08日 06:21:07 | falsetru | set | nosy:
+ falsetru |
| 2010年09月18日 13:46:46 | BreamoreBoy | set | versions:
+ Python 2.7, - Python 2.6 nosy: + BreamoreBoy messages: + msg116777 stage: test needed -> patch review |
| 2009年05月12日 17:52:26 | ajaksu2 | set | versions:
+ Python 2.6, - Python 2.5 nosy: + ajaksu2 messages: + msg87647 keywords: + patch stage: test needed |
| 2008年01月04日 17:19:17 | schmir | set | nosy:
+ schmir messages: + msg59242 |
| 2007年09月24日 17:17:07 | jafo | set | priority: normal type: behavior components: + Library (Lib), - None |
| 2007年09月24日 14:49:49 | georg.brandl | set | nosy:
+ georg.brandl messages: + msg56112 |
| 2007年09月24日 10:48:56 | Rebecca | create | |