Seite 1 von 1

Kann sys.stdin "leer" sein?

Verfasst: Montag 13. September 2004, 08:24
von friesi
Ich würde gerne überprüfen ob sys.stdin dem Programm etwas übergibt und falls nicht, soll eine Fehlermeldung kommen.

Doch leider wartet er ja solange auf eine Eingabe, bis etwas kommt und bricht nicht von selbst ab. Kann man das irgendwie hinbekommen?

Also ich will dem Script ermöglichen, entweder eine Datei als Argument zu übergeben oder von einem anderen Programm den Output in dieses Script zu pipen.

Bis jetzt hab ich es so:

Code: Alles auswählen

    if args:
            msgfile = args[0]
            fp = open(msgfile)
    elif sys.stdin:
            fp = sys.stdin
    else:
            usage(1)
usage(1) ruft eine Funktion auf, die das Programm abbricht und ein Info/Help Text ausgibt. Wenn ich das elif rausnehme, gehts auch.
Nur wartet er sonst immer auf eine Eingabe.

Verfasst: Montag 13. September 2004, 13:53
von Beyond
Eigentlich bricht read ab, sobald eine EOF (Ctrl-D) kommt.

cu beyond

Verfasst: Montag 13. September 2004, 16:57
von Milan
Ein Fileende muss aber nicht automatisch kommen, wenn nix in das Programm gepipt wurde... dann ist sys.stdin in der Tat leer. Aber man man müsste doch die Größe von stdin feststellen können, oder? Ist ja auch nur ein Filehandler... ungetestet:

Code: Alles auswählen

import os,sys
print os.fstat(sys.stdin.fileno())[6]
mfg, Milan

Verfasst: Montag 13. September 2004, 19:03
von Milan
Habs jetzt getestet... funktioniert leider nicht, die Dateigröße ist immer 0. Ich glaube, die wird auch erst nach dem schließen aktualisiert und ist somit nutzlos. dafür kannst du mit sys.stdin.isatty() abfragen, ob stdin mit einer Konsole verbunden ist (True) oder nicht (False). Damit sollte in deinem Fall klar sein, ob Daten hineingepipt wurden oder nicht :wink: . Testen kann aber trotzdem nicht schaden, auch wenn es bei mir unter lin funktionierte...