Seite 1 von 1

KeyboardInterrupt/EOF bei raw_input

Verfasst: Freitag 21. September 2007, 12:05
von Rebecca
Folgendes Programm:

Code: Alles auswählen

while True:
    try:
        s = raw_input('> ')
    except:
        pass
Ich haette gedacht, dass ich dieses Programm jetzt mit Ctrl-D und Ctrl-C nicht mehr abbrechen koennen sollte. Aber sobald ein Ctrl-C auf ein Ctrl-D folgt gibts das hier:

Code: Alles auswählen

rbreu@zam285:~> python2.5 a18.py
> > > > > > > > Traceback (most recent call last):
  File "a18.py", line 3, in <module>
    s = raw_input('> ')
KeyboardInterrupt
(Mit Python 2.4 und 2.5). :?:

Verfasst: Freitag 21. September 2007, 12:12
von Leonidas
Wenn ich mich richtig erinnere fängt ein reines ``except`` nur Exceptions ab. Aber KeyboardInterrupt erbt nicht von ``Exception``, sondern nur von ``BaseException``.

Verfasst: Freitag 21. September 2007, 12:32
von Rebecca
Das merkwuerdige: Wenn ich das Programm starte und Ctrl-C druecke, gehts. Wenn ich das Programm starte und Ctrl-D druecke, gehts. Wenn ich das Programm starte und Ctrl-C und danach (im nachsten Schleifen-Durchlauf) Ctrl-D druecke, gehts. Nur wenn ich ein Ctrl-C nach einem Ctrl-D druecke, sehe ich die Exception.

Und die Variante, statt einem allgemeinen except ein except (KeyboardInterrupt, EOFError) zu schreiben, tut das gleiche.

Verfasst: Freitag 21. September 2007, 12:55
von helduel
Moin,
Rebecca hat geschrieben:Das merkwuerdige: Wenn ich das Programm starte und Ctrl-C druecke, gehts. Wenn ich das Programm starte und Ctrl-D druecke, gehts. Wenn ich das Programm starte und Ctrl-C und danach (im nachsten Schleifen-Durchlauf) Ctrl-D druecke, gehts. Nur wenn ich ein Ctrl-C nach einem Ctrl-D druecke, sehe ich die Exception.

Und die Variante, statt einem allgemeinen except ein except (KeyboardInterrupt, EOFError) zu schreiben, tut das gleiche.
hört sich nach einem Bug an. Kannst den ja mal auf http://bugs.python.org/ melden.

Gruß,
Manuel

Verfasst: Freitag 21. September 2007, 15:40
von Zap
Ich kann den Bug bei mir nicht nachvollziehen. Habe das Skript unter WindowsXP ausprobiert, allerdings nur KeyboardInterrupt abgefangen.
Keine der genannten Tastenkombos warf ne Exception...

EDIT: OK, das EOFError brauch ich auch, aber dann bekomme ich auch keine Exception...

Verfasst: Freitag 21. September 2007, 15:49
von BlackJack
Unter Windows ist Strg-D auch Strg-Z ─ das ist das Signal an das Terminal bzw. die Eingabeaufforderung die Verbindung zur Standardeingabe des Programms zu schliessen.

Verfasst: Samstag 22. September 2007, 07:48
von Zap
Jo, ich weiß aber aber wie gesagt ich bekomme keine Exception ...
Schaffe es nicht das Skript über irgendwelche Tastenkombinationen zu beenden. Ich könnte mir höchstens vorstellen, das eine Shell unter Linux u.U. anders mit dem Signal umgeht.

Verfasst: Samstag 22. September 2007, 19:17
von lunar
Ich kann das Verhalten hier unter Gentoo nachvollziehen. Allerdings ändert sich das, sobald man readline importiert. Dann ist das Programm tatsächlich nicht mehr aabzubrechen, es wird keine Exception angezeigt.

Verfasst: Mittwoch 26. September 2007, 13:00
von Rebecca
Habs als bug submittiert: http://bugs.python.org/issue1195

Verfasst: Mittwoch 26. September 2007, 19:31
von birkenfeld
Ich hab dir schon was dazugeschrieben...

Verfasst: Mittwoch 26. September 2007, 19:42
von Rebecca
Jo. Dachte nur, da ich hier nunmal diesen Thread gestartet hab, interessiert es die andern auch. :D