Frage zu Outstreams

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
lunar

Ich weiß nicht, ob das für ein Terminal als Ganzes funktioniert. Für ein einzelnes Programm funktioniert es auf jeden Fall:

Code: Alles auswählen

some_app > /dev/pts/1 2> /dev/pts/2
Damit landen Standardausgabe und Standardfehlerstrom auf zwei verschiedenen Pseudoterminals, sprich in zwei verschiedenen Terminalemulatoren, vorausgesetzt natürlich, auf beiden Pseudoterminals läuft ein Terminalemulator.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das klappt tatsächlich. Angenommen man hat 2 Terminalfenster offen, dann kann man die Ausgabe von dem ersten geöffneten Fenster beispielsweise so umleiten:

Code: Alles auswählen

ls *.py > /dev/pts/0 2> /dev/pts/1
Wer jetzt kommt mit "das hätte man auch ganz einfach selbst herausfinden können", der hat durchaus recht. :lol:

Übrigens muss ich meine eingangs gemachte Anmerkung korrigieren: Ich meinte eben doch genau sowas mit Umleitung.
lunar

snafu hat geschrieben:Wer jetzt kommt mit "das hätte man auch ganz einfach selbst herausfinden können", der hat durchaus recht. :lol:
Ich habs mir die ganze Zeit verkniffen ;)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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.
Antworten