[Python-de] einlesen stdin

Gerhard Quell gquell at skequell.de
Mon Aug 16 09:02:49 CEST 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hallo Leut,

~ versuchs mal so:


#!/usr/bin/env python
# testprogramm getchar

import os, sys
import termios

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
~      try:
~        termios.tcsetattr(fd, termios.TCSANOW, new)
~        termios.tcsendbreak(fd,0)
~        ch = os.read(fd,7)    # vorher: 7
~      finally:
~         termios.tcsetattr(fd, termios.TCSAFLUSH, old)
~   else:
~      ch = os.read(fd,7)

~   return(ch)

if __name__ == "__main__":
~ print "Zeichen eingeben" ,
~ cc=getch()
~ for j in cc: print "%x" % ord(j),
# End getchar.py


Gruß Gerhard

h.froels at epost.de wrote:
| 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 ?
|
- --
- ------------------------------------------------------ skequell ------
~ Gerhard Quell                       Software & Knowledge Engineering
~ Schützenweg 3      eMail:     gquell at skequell.de  Fon: 0731-26400651
~ 89275 Elchingen    web  : http://www.skequell.de  Fax: 0731-26400652
- --------------- pgp: 473EC53C  -  http://www.keyserver.net/en---------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFBIFwYvHbZD0c+xTwRAq0FAJ9vQ8oCBb0uSFOu/RwL7BzTnw2ZEACghgjK
hwhjwOXKyb+wcDqkKCNRz6A=
=fNPV
-----END PGP SIGNATURE-----