Kann sys.stdin "leer" sein?

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
friesi
User
Beiträge: 5
Registriert: Donnerstag 9. September 2004, 17:52

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.
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Eigentlich bricht read ab, sobald eine EOF (Ctrl-D) kommt.

cu beyond
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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