python 2.7.12 on Linux behaving differently than on Windows

BartC bc at
Thu Dec 8 07:43:18 EST 2016

On 08/12/2016 07:24, Gregory Ewing wrote:
> BartC wrote:

>> (I'm in the middle of porting my console editor to Linux. But one
>> problem is that on one Linux, half the key combinations (eg.
>> Shift+Ctrl+B) are not recognised.
> If you're reading characters from a tty device in raw
> mode (which I assume is what you mean by "console editor")
> I'm not aware of *any* Unix system that will let you
> distinguish between Ctrl+B and Shift+Ctrl+B that way.
> That's because the tty driver delivers ASCII characters,
> and there are no separate ASCII codes for shifted control
> characters.

Run the code below and start pressing keys. On both of my Linuxes, I get 
escape sequences shown when I Insert, Delete, Home, End, Page Up, Page 
Down, Up, Down, Left, Right and most of the function keys; not just 
single ASCII codes.

But I also get different sequences, on Ubuntu, when I press Shift, Ctrl 
or Alt with those keys, but not all shifts nor combinations will work 
(some have special meanings anyway).

Then I try the same on Debian (I think it is) on a Raspberry Pi, and 
most Shift and Ctrl are ignored, except for Ctrl A to Z (with a few gaps).

(Neither will see Shift+Ctrl+B, which means go to start of the file, 
same as Ctrl+Home. Ubuntu sees Ctrl+Home, but not Debian, although it 
will report Alt+Home. And some laptop keyboards already have Home on an 
Alternate-Function shift! It's a mess.)

>> Except that was only two Linuxes; perhaps on others, the keyboard will
>> likely be crippled in some other way.
> No, they'll all be the same -- if it has an ASCII code,
> you'll be able to get it from a tty device, otherwise you
> won't.

>> How people manage to do anything on such an OS I've no idea.
> Programs that need to be able to distinguish all of the
> modifiers are normally implemented as GUI applications,
> which get keyboard input a different way.

How do they work; what magic do they use to get that key information, 
and why can't it be done outside of a GUI? As I understand a Linux GUI 
is built on top of Linux.

# Python 2 because of the 'print' handling

def getch():     # adapted from first getch I saw on the internet
         import sys, tty, termios
         fd = sys.stdin.fileno()
         old_settings = termios.tcgetattr(fd)
         ch =
         termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
         return ord(ch)

print "Press keys"
print ("Hit Escape twice to quit")

while 1:

     if k==27:
         print "Esc ",
         if escape: break
     elif k==13:
         print "Enter"
     elif k==10:
         print "Newline"
     elif k<=26:
         print "Ctrl",chr(k+64)
         print chr(k),

     escape = k==27


(On another test, using a C-based getch(), pressing Enter returns code 
10 not 13; another difference to note. Either code appears to clash with 
Ctrl-M or Ctrl-J, a difference from Windows where Ctrl-J, Ctrl-M and 
Enter are distinct keys, as they are in actuality.)


More information about the Python-list mailing list