Terminal emulieren...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie kann man Platformübergreifen einen einfaches Terminal emulieren???

z.Z. mache ich ein einfaches char = sys.stdin.read(1) in einem separaten Thread.

Vollständige Skript: https://github.com/jedie/DragonPy/blob/ ... 09_test.py

Das Dumme: Man sieht die Zeichen die man eintippt. Doch ich würde diese gern nicht anzeigen lassen, weil es eh quasi per "echo" angezeigt wird.


btw. eine Platformübergreifende Lösung um Dinge im Terminal an einer bestimmten Stelle zu schreiben, gibt es nicht wirklich, oder?
Also z.B. sowas wie eine Aktualisierende Status-Zeile...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

jens hat geschrieben:Wie kann man Platformübergreifen einen einfaches Terminal emulieren???
Mehrere Fragen wären da zu klären:
- plattformübergreifend: Welche Plattformen soll es unterstützen?
- einfaches Terminal: Was soll es können?
- emulieren: Was alles soll emuliert werden?

Zu den Plattformen wäre zu sagen, dass z.B. Pseudoterminals POSIX spezifiziert sind und man daher auf POSIX-konformen Systemen diese Funktionalität nutzen könnte. Hat den Vorteil, dass man bei der Emulation das Verhalten des basalen Zeichengerätes nicht nachbauen müsste. Betrifft Unices wie BSD, OSX als auch Linux-Systeme. Windows kann das nicht, dort sind Terminals im Vergleich zu POSIX weniger mächtig (dumm ;) ) und die API ist komplett verschieden.
Dein echo-Problem lässt sich relativ einfach auf beiden Systemen lösen. Wobei ich mich frage, ob Du nicht gerade auf der Suche nach dem "Grafiktreiber" für den Dragon bist. Dann wäre Deine jetzige Lösung übers Selbstzeichnen in einem Fenster vielversprechender, als Systemterminals umständlich verbiegen zu wollen. In Deinem Fenster hast Du ja alle Kontrolle über Events, Positionen etc. Damit lässt sich ein einfaches Cursor-System recht schnell realisieren.
Vllt. hab ich Deine Frage auch missverstanden.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nein um eine grafische Lösung geht es hier nicht. Aber du hast recht, bei dieser habe ich per event volle Kontrolle. Das hab ich als consolen Anwendung aber nicht.

Das einzige was mir noch eingefallen ist: stdout um biegen und dann nur die Ausgabe des Emulators ausgeben. So sieht man die Eingaben vom user nicht, denke ich.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ja klar als echte Konsolenanwendung bleibt Dir nichts anderes übrig, als diese zu verwenden. Üblicher Verdächtiger zur Terminalansteuerung wäre `urwid`, das ließe sich mit PDCurses selbst unter Windows nutzen.
Falls Du nur wenige Primitive wie Farbe- und Cursorpositionsetzen brauchst, könntest Du unter Windows das auch mit ctypes und der Win-API relativ schnell lösen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das hört sich mehr nach Arbeit an, als nach "fertige Lösung" ;)


Ich hab gerade mal probiert sys.stdout und sys.stderr umzubiegen.
Das bringt es nicht. Weder unter Linux, noch unter Windows. Anscheinend werden eingaben erst nach dem ENTER nach stdin gesendet und schon vorher auf stdout ausgegeben :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Diese beiden Dateien haben nicht wirklich etwas mit dem Terminal selbst zu tun. Die sind sozusagen die minimale, plattformübergreifende Schnittstelle für Ein- und Ausgaben, und müssen auch gar nicht mit einem Terminal verbunden sein. Da kann ja auch ein anderes Programm dranhängen, oder Dateien auf der Festplatte.

Wenn Du keine Zeilenpufferung haben möchtest, dann musst Du das Terminal von ”cooked” auf ”raw” umstellen um jeden Tastendruck zu bekommen. Wie man das macht ist bei Windows anders als bei Unix. Als nächstes ist dann die Frage wie Steuertasten im ”raw”-Modus eigentlich an das Programm gemeldet werden. Das ist dann selbst unter Unix nicht mehr einheitlich. Darum gibt es an der Stelle so etwas wie `curses` was über den Unix-Terminal-Zoo eine gemeinsame API legt. Wie jerch schon erwähnte gibt es einen Windows-Port vom `curses`-Modul. Und wenn man sich mit der API von `curses` (der Name ist wohl nicht zufällig gewählt ;-)) nicht herumschlagen möchte, gibt es das ebenfalls von jerch erwähnte `urwid` als hübschere Schicht darüber.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

hab eine Plattform unabhängige pure Python Lösung gefunden:
http://pypi.python.org/pypi/pager
bzw.
https://bitbucket.org/techtonik/python-pager/
bzw. die Datei:
https://bitbucket.org/techtonik/python- ... p/pager.py

Im Prinzip, nur char = sys.stdin.read(1) durch char = pager.getch() ersetzten: https://github.com/jedie/DragonPy/commi ... e6b2513966

Sehr feine Sache!

pager.py soll in die Standard Bibliothek aufgenommen werden, siehe: http://bugs.python.org/issue8408

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Der Autor *wollte* das gerne in der Standardbibliothek aufgenommen haben. Und den Bug den er dazu aufgemacht hat, haben sie ihm wieder geschlossen, mit dem Hinweis, dass das ein Bug-Report nicht der passende Weg ist ein neues Modul in die Standardbibliothek zu bekommen. Das war 2010.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hast recht... Ist aber irgendwie dumm... Würde es begrüßen, wenn eine Lösung in der Standard Lib wäre.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten