In Linux gibt es eine Datei, /sys/kernel/debug/tracing/trace_pipe
, die, wie der Name sagt, eine Pipe ist. Also, lassen Sie uns sagen, dass ich die ersten 50 Bytes aus es mit Python lesen wollen - und ich den folgenden Code:Datei mit Timeout in Python lesen
$sudo python -c 'f=open("/sys/kernel/debug/tracing/trace_pipe","r"); print f; print f.read(50); f.close()<br>
<open file '/sys/kernel/debug/tracing/trace_pipe', mode 'r' at 0xb7757e90>
Wir können sehen, dass die Datei zu öffnen schnell geht (wenn wir die Super-User-Berechtigungen haben) - aber Wenn die trace_pipe
Datei zu diesem Zeitpunkt leer ist, wird sie einfach blockiert (und selbst wenn Inhalt vorhanden ist, wird der Inhalt ausgegeben, bis es nicht mehr vorhanden ist, und dann wird die Datei wieder blockiert). Dann habe ich Ctrl drücken - C den Python-Skript zu unterbrechen, mit einem KeyboardInterrupt
...
Wie kann ich Python 2.7 mit Timeout einen Lese tun?
Das heißt, ich will Python instruieren „versuchen 50 Bytes aus dieser Datei lesen, wenn Sie nicht nach einer Sekunde gelingt es, aufgeben und zurückkehren“?
Vielen Dank dafür, @Alfe - Ich habe 'os.read' vergessen ... Allerdings möchte ich in erster Linie den Fall behandeln wenn ich nichts zu lesen habe! Danke, dass Sie ['select'] notiert haben (http://docs.python.org/2/library/select.html) - aber in meinem Fall, was ist' rlist', 'wlist' oder' xlist'? Was sollte ich erwarten, wenn ich nichts zu lesen habe? Gibt 'select' an, wieviel Bytes verfügbar sind, wenn ich es benutze oder nur" mindestens 1 Byte verfügbar ist "? – sdaau
Siehe meine EDIT über 'Select' auf, wie man es benutzt. 'select' gibt Subsets der Datenströme zurück, die Sie ihm übergeben haben. Ihr Fall ist simpel, Sie haben nur einen Stream, von dem Sie nur lesen möchten, also lassen Sie alles andere leer. Geben Sie eine Zeitüberschreitung von 0 ein, so dass es für nichts _wait_ erwartet, und testen Sie dann, ob etwas von "f" lesbar ist. Wenn ja, kann mindestens ein Byte gelesen werden. Lesen Sie dann mindestens dieses eine Byte und höchstens 50 Byte (wie Sie angegeben haben) aus diesem Stream. – Alfe
Ah, eine Sache, die Sie beachten sollten, ist die Tatsache, dass normalerweise eine Pipe geschrieben werden kann, es sei denn, dass ein Leser davon liest. Sie werden also nie etwas warten müssen, um in dieser Pipe gelesen zu werden. Vielleicht sollten Sie ein Timeout ein wenig größer als 0 verwenden ;-) – Alfe