只需添加此注意,爲更好的格式化:
@ 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
都會引發此異常)
非常感謝,@Alfe - 我忘記了'os.read' ...但是,我確實想要主要處理這個案例當我沒有什麼可讀的時候!感謝您指出['select'(http://docs.python.org/2/library/select.html) - 但對我來說,什麼是'rlist','wlist',或'xlist'?如果我沒有什麼可讀的,我應該期待什麼?當我使用它時,「select」告訴我可用的字節總數,或者「至少有1個字節可用」? – sdaau
請參閱我的編輯關於'選擇'如何使用它。 'select'返回你交給它的流集合的子集。你的情況很簡單,你只有一個流只能讀取,所以一切都空着。給一個0超時,所以它永遠不會_wait_,然後測試是否有'f'可讀的東西。如果是這樣,至少可以讀取一個字節。然後從該流中讀取至少一個字節和最多50個字節(如您指定的那樣)。 – Alfe
啊,你應該注意的一件事情是,通常情況下,除非有閱讀器讀取它,否則管道不能寫入。所以你將永遠不會有任何東西在等待在管道中讀取。也許你應該使用超時有點大於0 ;-) – Alfe