[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-----