Sense up arrow in Python?
<p>I have this script</p>

<pre><code>import sys, os, termios, tty
home = os.path.expanduser("~")
history = []
if os.path.exists(home+"/.incro_repl_history"):
    readhist = open(home+"/.incro_repl_history", "r+").readlines()
    findex = 0
    for j in readhist:
        if j[-1] == "\n":
            readhist[findex] = j[:-1]
        else:
            readhist[findex] = j
        findex += 1
    history = readhist
    del readhist, findex

class _Getch:
    def __call__(self):
            fd = sys.stdin.fileno()
            old_settings = termios.tcgetattr(fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(3)
            finally:
                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
            return ch

while True:
    try:
        cur = raw_input("&gt; ")
        key = _Getch()
        print key
        if key == "\x1b[A":
            print "\b" * 1000
            print history[0]
        history.append(cur)
    except EOFError:
        sys.stdout.write("^D\n")
        history.append("^D")
    except KeyboardInterrupt:
        if not os.path.exists(home+"/.incro_repl_history"):
            histfile = open(home+"/.incro_repl_history", "w+")
            for i in history:
                histfile.write(i+"\n")
        else:
            os.remove(home+"/.incro_repl_history")
            histfile = open(home+"/.incro_repl_history", "w+")
            for i in history:
                histfile.write(i+"\n")
    sys.exit("")
</code></pre>

<p>When run, it get's the contents of <code>/home/bjskistad/.incro_repl_history</code>, reads the lines, and removes the newspace character, and then defines the <code>_Getch</code> class/function. Then, it runs the main loop of the script. It <code>try</code>s to set <code>cur</code> to <code>raw_input()</code>. I then try to sense the up arrow using the <code>_Getch</code> class defined. This is where I am having trouble. I can't sense the up arrow using my <code>_Getch</code> class. How can I sense the up arrow with my current code?</p>

<p>The <code>raw_input</code> function always read a string until ENTER, not a single character (arrow, etc.)</p>

<p>You need to define your own <code>getch</code> function, see: <a href="http://stackoverflow.com/questions/510357/python-read-a-single-character-from-the-user">Python read a single character from the user</a>. </p>

<p>Then you can re-implement your "input" function with a loop using getch` function.</p>

<p>Here is a simple usage:</p>

<pre><code>while True:
    char = getch()
    if char == '\x03':
        raise SystemExit("Bye.")
    elif char in '\x00\xe0':
        next_char = getch()
        print("special: {!r}+{!r}".format(char, next_char))
    else:
        print("normal:  {!r}".format(char))
</code></pre>

<p>Under Windows, with the following keys: <code>Hello&lt;up&gt;&lt;down&gt;&lt;left&gt;&lt;right&gt;&lt;ctrl+c&gt;</code>, you'll get:</p>

<pre><code>normal:  'H'
normal:  'e'
normal:  'l'
normal:  'l'
normal:  'o'
special: '\xe0'+'H'
special: '\xe0'+'P'
special: '\xe0'+'K'
special: '\xe0'+'M'
</code></pre>

<p>So  arrow corresponds to the combining characters: "\xe0H".</p>

python arrow-keys getch