Wie überprüfen Sie in Python, ob sys.stdin
Daten vorhanden sind oder nicht?
Ich habe festgestellt, dass os.isatty(0)
nicht nur überprüft werden kann, ob stdin mit einem TTY-Gerät verbunden ist, sondern auch, ob Daten verfügbar sind.
Aber wenn jemand Code wie verwendet
sys.stdin = cStringIO.StringIO("ddd")
und nach dieser Verwendung os.isatty(0)
wird immer noch True zurückgegeben. Was muss ich tun, um zu überprüfen, ob stdin Daten hat?
os.isatty(0)
überprüft wird, ob die dem Dateideskriptor (fd) 0 zugeordnete Datei ein TTY ist. Wenn Sie diesys.stdin
Variable ändern , ändern Sie nicht die mit fd0 verknüpfte Datei. fd0 zeigt immer noch auf das ursprüngliche stdin (was in Ihrem Fall ein TTY ist).cStringIO.StringIO("ddd")
blockieren könnte; Es sind immer Daten verfügbar, außer wenn EOF natürlich erreicht ist.Antworten:
Auf Unix-Systemen können Sie Folgendes tun:
import sys import select if select.select([sys.stdin,],[],[],0.0)[0]: print "Have data!" else: print "No data"
Unter Windows kann das Auswahlmodul jedoch nur mit Sockets verwendet werden, sodass Sie einen alternativen Mechanismus verwenden müssen.
quelle
select
Der Aufruf der Auswahlfunktion des Betriebssystems kann nur mit diesen Dateien funktionieren.StringIO
ist eine virtuelle Datei, die nur dem Python-Interpreter bekannt ist, daher hat sie keinen Dateideskriptor und kann nicht verwendet werdenselect
.sys.stdin.isatty()
hat aber für mich innerhalb von cron gearbeitet.<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
und nicht[]
Ich habe benutzt
if not sys.stdin.isatty()
Hier ist ein Beispiel:
import sys def main(): if not sys.stdin.isatty(): print "not sys.stdin.isatty" else: print "is sys.stdin.isatty"
Laufen
$ echo "asdf" | stdin.py not sys.stdin.isatty
sys.stdin.isatty()
gibt false zurück, wenn etwas drin iststdin
.isatty(...) isatty() -> true or false. True if the file is connected to a tty device.
quelle
select
.grep
in einem anderen Beitrag erwähnt wird, werde ich erwähnen, dassless
verwendetisatty
. Ich bin hierher gekommen, um etwas zu tun wieless
: Eingabe aus einer Datei lesen, wenn ein Dateipfad als Eingabeargument angegeben ist, andernfalls Eingabe von stdin lesen. Eine Alternative besteht darin,-
als Alias für stdin zu verwenden und nur das Dateiargument zu akzeptieren.Abhängig vom Ziel hier:
import fileinput for line in fileinput.input(): do_something(line)
kann auch nützlich sein.
quelle
(Bearbeiten: Dies beantwortet eine verwandte Frage, die seitdem hier zusammengeführt wurde.)
Wie von anderen erwähnt, gibt es keine narrensichere Methode, um festzustellen, ob Daten von stdin verfügbar werden, da UNIX dies nicht zulässt (und allgemeiner, weil es das zukünftige Verhalten des Programms, mit dem stdin verbunden ist, nicht erraten kann).
Warten Sie immer auf stdin, auch wenn möglicherweise nichts vorhanden ist (das
grep
tun usw.), oder fragen Sie den Benutzer nach einem-
Argument.quelle
printf "" | cat
oderwhile read l; do true; done; echo finishing
(im zweiten Fall müssen Sie EOF / ^ D manuellcat
in die Befehlszeile eingeben , die Eingabe auf unbestimmte Zeit wartet. Im obigen Beispiel sendet printf EOFMit eingebauten Modulen kann dies mit folgendem Code erreicht werden, da Greg bereits die Idee hatte:
import fileinput isStdin = True for line in fileinput.input: # check if it is not stdin if not fileinput.isstdin(): isStdin = False break # continue to read stdin print(line) fileinput.close()
quelle