[Python-de] einlesen stdin

h.froels at epost.de h.froels at epost.de
Fre Aug 13 21:28:05 CEST 2004


Hallo Leute,

die Eingaben in meine Python-Programmen realisiere ich mit folgendem Script,
das ich aus dem Internet habe:

def getch():

   fd = sys.stdin.fileno()
   old=termios.tcgetattr(fd)
   new=termios.tcgetattr(fd)
   new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
   new[6] [termios.VMIN] = 1
   new[6] [termios.VTIME] =0
   termios.tcsetattr(fd, termios.TCSANOW, new)

   try:
      ch = os.read(fd,5)
   finally:
      termios.tcsetattr(fd, termios.TCSAFLUSH, old)

   return(ch)


Rufe ich meine Python-Programme aus unserer Warenwirtschaft auf
(ASCII unter Linux), die anscheinend die Attribute der stdin
ändert, bekomme ich die Fehlermeldung 'Invalid Argument' in der
Zeile  "old=termios.tcgetattr(fd)".

Darauf hin habe ich die Funktion wie folgt geändert:

def getch():

   fd = sys.stdin.fileno()
   if os.isatty(fd):
      old=termios.tcgetattr(fd)
      new=termios.tcgetattr(fd)
      new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
      new[6] [termios.VMIN] = 1
      new[6] [termios.VTIME] =0
      termios.tcsetattr(fd, termios.TCSANOW, new)
      try:
         ch = os.read(fd,5)    # vorher: 7
      finally:
         termios.tcsetattr(fd, termios.TCSAFLUSH, old)
   else:
      ch = os.read(fd,7)

   return(ch)

Das funktioniert soweit, nur werden jetzt die längeren Tastencodes
(max 5 Byte) nicht in einem, sondern in 2 reads eingelesen, mit unter-
schiedlichen Längen.

Hat jemand eine Idee, wie ich entweder die Tastendrücke in einem read
einlesen kann oder das Attribut der stdin zurücksetzen kann, damit diese
wieder als tty vom termios erkannt wird ?



________________________________________
http://www.epost.de - das Kommunikationsportal der Deutschen Post