buggy python interpretter or am I missing something here?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Jan 30 23:06:59 EST 2014


On Thu, 30 Jan 2014 18:13:54 +1300, Gregory Ewing wrote:

> Steven D'Aprano wrote:
>> On Mon, 27 Jan 2014 12:22:22 -0800, Rick Johnson wrote:
>> 
>>>Why do we even need an "input" function anyway if all it is going to do
>>>is read from stdin?
>> 
>> That's not all it does.
>> 
>> For example, it handles backspacing, so that typing H E L O O BACKSPACE
>> BACKSPACE L O gives "HELLO" rather than "HELOO\x7f\x7fO".
> 
> No, it doesn't -- that's handled at a lower level. Any other method of
> reading from stdin, as long as it hasn't been redirected away from the
> console, has the same behaviour.
> 
> I typed some backspaces in the input to each of the following
> experiments, and they didn't end up in the data:
> 
>  >>> import sys
>  >>> x = sys.stdin.readline()
> HELLO
>  >>> x
> 'HELLO\n'
>  >>> import os
>  >>> f = os.fdopen(0)
>  >>> y = f.readline()
> adsxx
>  >>> y
> 'adsxx\n'


Very interesting. I admit I don't actually understand the way stdin 
works. Can you explain what's going on here then?

import sys, os
import tty, termios, fcntl

def getch():
    """Get a single character from standard input.

    Does not echo to the screen. This will block waiting for a keypress.
    """
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch


And in use:

>>> [getch() for i in range(14)]
['H', 'e', 'l', 'l', 'l', '\x7f', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!']


where I type "Helll BACKSPACE o SPACE World!"


At what point do the arrow keys and other readline or readline-like 
features get handled?



-- 
Steven



More information about the Python-list mailing list