Seite 1 von 1
Frage zu Outstreams
Verfasst: Sonntag 13. Juni 2010, 16:35
von snafu
Ich habe mich an meinem freien Tag mal wieder ein bißchen an Callisto gesetzt. Derzeit investiere ich viel Zeit in die Abstraktion von einheitlichem Verhalten unter Windows (`wincon.h` via `ctypes`) und unixoiden Terminals (`curses`-Modul). Nun tauchte bei mir eine theoretische Überlegung auf: Ist es - wenn wohl auch sehr selten verwendet - eigentlich möglich, dass der Datenstrom für Fehler auf ein anderes Ausgabegerät/Terminal zeigt als der Datenstrom für Standardausgaben? Konkret beziehe ich mich halt auf `stdout` u. `stderr` bzw `STD_OUTPUT_HANDLE` u. `STD_ERROR_HANDLE` (`winbase.h`). Ich will in einer Funktion nämlich die Breite des Terminals anzeigen. Bis auf Weiteres wird dazu `stdout` benutzt, weil ich nicht denke, dass ich an dieser Stelle (es dient als Hilfsfunktion) so stark unterscheiden muss, aber mich würde das trotzdem mal interessieren...
Anmerkung: Ich meine hier natürlich das Schreibziel, das ohne Benutzung einer Pipe verwendet wird.
Re: Frage zu Outstreams
Verfasst: Sonntag 13. Juni 2010, 18:19
von lunar
Unter Linux und wahrscheinlich auch unter jedem Unix kann man die Datenströme ohne weiteres auf verschiedene Terminals umleiten, indem man die entsprechenden Gerätedateien unter "/dev/" als Ziel der Umleitung angibt.
Re: Frage zu Outstreams
Verfasst: Donnerstag 17. Juni 2010, 08:57
von snafu
Dann mal konkret gefragt, weil ich nichts dazu finde: Wie kann ich `gnome-terminal` (von mir aus auch `xterm`) dazu bringen, dass ich STDIN in einem Fenster habe, STDOUT jedoch in einem anderen? Ich möchte also irgendwo Eingaben machen und die Ausgabe woanders sehen.
Re: Frage zu Outstreams
Verfasst: Donnerstag 17. Juni 2010, 09:13
von lunar
Ich weiß nicht, ob das für ein Terminal als Ganzes funktioniert. Für ein einzelnes Programm funktioniert es auf jeden Fall:
Damit landen Standardausgabe und Standardfehlerstrom auf zwei verschiedenen Pseudoterminals, sprich in zwei verschiedenen Terminalemulatoren, vorausgesetzt natürlich, auf beiden Pseudoterminals läuft ein Terminalemulator.
Re: Frage zu Outstreams
Verfasst: Donnerstag 17. Juni 2010, 09:54
von snafu
Das klappt tatsächlich. Angenommen man hat 2 Terminalfenster offen, dann kann man die Ausgabe von dem ersten geöffneten Fenster beispielsweise so umleiten:
Wer jetzt kommt mit "das hätte man auch ganz einfach selbst herausfinden können", der hat durchaus recht.
Übrigens muss ich meine eingangs gemachte Anmerkung korrigieren: Ich meinte eben doch genau sowas mit Umleitung.
Re: Frage zu Outstreams
Verfasst: Donnerstag 17. Juni 2010, 12:12
von lunar
snafu hat geschrieben:Wer jetzt kommt mit "das hätte man auch ganz einfach selbst herausfinden können", der hat durchaus recht.

Ich habs mir die ganze Zeit verkniffen

Re: Frage zu Outstreams
Verfasst: Donnerstag 17. Juni 2010, 22:05
von snafu
Das ist zugegeben einer der Fälle, wo man im Nachhinein auch so einen Kommentar abgeben würde, wenn man nicht dummerweise selbst der Fragesteller wäre...
Re: Frage zu Outstreams
Verfasst: Mittwoch 23. Juni 2010, 10:47
von jerch
Das klappt im Prinzip mit allen Terminalgeräten, für die Du ausreichende Rechte besitzt. Mit dem richtigen Treiber an Bord könnte das auch ein Fernschreiber sein. (Für den einfachen Ausgabefall reicht ja ein
file like object.)
Du kannst es auch im Programm ändern und so STDOUT an verschiedene Ausgabegeräte zielgenau richten. Für komplexere Ausgaben mit Escapensequenzen dürfte dann allerdings das vorherige Auslesen der Terminaleigenschaften sehr aufwendig werden.
Code: Alles auswählen
>>> import sys
>>> f = open('/dev/tty2','w') #linux console
>>> sys.stdout = f
>>> print 'huhu'
>>> f2 = open('/dev/pts/4','w') # ssh terminal
>>> sys.stdout = f2
>>> print 'huhu'
usw.