Linux内には、ファイル/sys/kernel/debug/tracing/trace_pipe
があります。これは、その名前が示すように、パイプです。したがって、Python-を使用して、最初の50バイトを読み取り、次のコードを実行するとします。
$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>
ファイルを開くのが速くなることがわかります(スーパーユーザーのアクセス許可がある場合)-ただし、その時点でtrace_pipe
ファイルが空の場合は、単にブロックされます(コンテンツがある場合でも、コンテンツはなくなるまでダンプされ、その後再びファイルがブロックされます)。それから私は押す必要があります Ctrl-C PythonスクリプトをKeyboardInterrupt
..で中断する.
どうすればPython 2.7でタイムアウト付きの読み取りを実行できますか?
つまり、Python to "このファイルから50バイトを読み取ってみてください。1秒経っても成功しない場合は、あきらめて戻るように指示したいと思います。 "?
使用する
os.read(f.fileno(), 50)
代わりに。これは、指定されたバイト数が読み取られるまで待機しませんが、何か(最大で指定されたバイト数)を読み取ったときに戻ります。
そのパイプから読み取るnothingがある場合、これは問題を解決しません。その場合、モジュールselect
からtestまでのselect
を使用して、読み取るものがあるかどうかを確認する必要があります。
編集:
select
を使用した空の入力のテスト:
import select
r, w, e = select.select([ f ], [], [], 0)
if f in r:
print os.read(f.fileno(), 50)
else:
print "nothing available!" # or just ignore that case
f = os.open("/sys/kernel/debug/tracing/trace_pipe", os.O_RDONLY|os.O_NONBLOCK)
ブロッキングを防ぐ必要があります(Unixでのみ機能します)。ここで選択する必要はありません。
書式設定を改善するために、これをメモとして追加するだけです。
私の場合の@Alfeの答え:
$ Sudo python -c 'import os, select;
f=open("/sys/kernel/debug/tracing/trace_pipe","r"); print f;
rrdy, wrdy, xrdy = select.select([f], [], [], 1); print rrdy, wrdy, xrdy ;
timeout= "timed out" if (rrdy==[]) else "" ;
print timeout;
print os.read(f.fileno(), 50) if timeout=="" else "";
f.close() '
ファイルに何かがある場合、次のような応答があります。
<open file '/sys/kernel/debug/tracing/trace_pipe', mode 'r' at 0xb76f0e90>
[<open file '/sys/kernel/debug/tracing/trace_pipe', mode 'r' at 0xb76f0e90>] [] []
Xorg-1033 [001] 12570.075859: <user s
ファイルに何も含まれていない場合は、次のようになります。
<open file '/sys/kernel/debug/tracing/trace_pipe', mode 'r' at 0xb7831e90>
[] [] []
timed out
select
のドキュメントでは、timeout
パラメータが秒単位であることが明示されていませんが、浮動小数点値(0.5など)も機能することに注意してください。
@GabiMeの答え:
$ Sudo python -c 'import os;
filno = os.open("/sys/kernel/debug/tracing/trace_pipe", os.O_RDONLY|os.O_NONBLOCK);
f=os.fdopen(filno, "r"); print f;
print "A", f.read(50);
print "B", os.read(f.fileno(), 50);
f.close() '
ファイルに何かがある場合、次のような応答があります。
<open file '<fdopen>', mode 'r' at 0xb77b6e90>
A bash-13777 [000] 13694.404519: sys_exi
B Timer-31065 [001] 13694.404830: sys_exi
ファイルに何も含まれていない場合は、次のようになります。
<open file '<fdopen>', mode 'r' at 0xb77c1e90>
A
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 11] Resource temporarily unavailable
...したがって、ファイルに何もない場合は、try
をキャッチするために、これをIOError
ブロックで実行する必要があります...(両方ともos.read
およびf.read
この例外が発生します)