web-dev-qa-db-ja.com

Python

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秒経っても成功しない場合は、あきらめて戻るように指示したいと思います。 "

14
sdaau

使用する

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
18
Alfe
f = os.open("/sys/kernel/debug/tracing/trace_pipe", os.O_RDONLY|os.O_NONBLOCK)

ブロッキングを防ぐ必要があります(Unixでのみ機能します)。ここで選択する必要はありません。

13
GabiMe

書式設定を改善するために、これをメモとして追加するだけです。

私の場合の@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この例外が発生します)

2
sdaau