[Python-de] 2004q3/005539.html
Hartmut Fröls
froels at panno.com
Mit Aug 18 10:32:24 CEST 2004
Hallo Gerhard,
vielen Dank für deine Bemühungen.
Anscheinend manipuliert die vorgeschaltete Warenwirtschaft die stdin so,
daß ich immer nur max. 3 Byte
vom read zurückbekomme, dummerweise ohne erkennbares System in 1-, 2-
oder 3-Byte-Paketen.
Ich habe lange gesucht aber keine Möglichkeit gefunden, eventuell
Eigenschaften der stdin zu ändern
(analog der flags bei os.open). Ich habe mir deshalb mit folgenden
Zeilen geholfen:
...
ch1 = os.read(fd,2)
ch = ch1
if len(ch1) == 2 or ch1 == "\033":
while 1:
if ch not in key_func + key_curs + key_curs1 and len(ch) < 5:
ch1 = os.read(fd,2)
ch = ch + ch1
else:
break
...
Ist vielleicht nicht elegant, funktioniert aber solange keiner ESC
drückt, dafür ist noch
der "Sicherheits-Abbruch" len(ch) <= 5.
Für elegantere Lösungen direkt an der stdin wäre ich aber immer noch
dankbar.
Gruß
Hartmut
Gerhard Quell schrieb:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hallo Hartmut,
>
> ~ hier mein Test und dessen Ausgabe, danach ist alles ok:
> ~ echo "1234567890" | ./getchar.py
> ~ Zeichen eingeben 31 32 33 34 35 36 37
>
> Gruß
>
> Gerhard
> - -------------
> Hartmut Fröls wrote:
> | gquell at skequell.de wrote:
> |
> |> 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
> |>
> | Sorry, da war ich wohl missverständlich.
> |
> | Das Problem liegt nicht in dem termios-Zweig, sondern bei dem
> | 2. read, wenn stdin nicht als tty erkannt wird !
> |
> |
> |
> |
> |
> | _______________________________________________
> | python-de maillist - python-de at python.net
> | http://python.net/mailman/listinfo/python-de
>
>
> - --
> - ------------------------------------------------------ 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
>
> iD8DBQFBIjLnvHbZD0c+xTwRAsADAJ0VluBgakdmgigSHvIPVIVy8SPzfQCffdqf
> Nt2XyCtHanNY8ofp+Wscny0=
> =O/GZ
> -----END PGP SIGNATURE-----
>
> _______________________________________________
> python-de maillist - python-de at python.net
> http://python.net/mailman/listinfo/python-de
>
--
Mit freundlichen Grüßen
H. Fröls
Peter Panno GmbH
Abteilung IT
Simon-Arzt-Str. 4
53332 Bornheim
Telefon 02222/9633-53
Telefax 02222/9633-51