在Linux中,有一个文件,/sys/kernel/debug/tracing/trace_pipe顾名思义就是管道。因此,假设我想使用Python从中读取前50个字节,然后运行以下代码:
/sys/kernel/debug/tracing/trace_pipe
$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用KeyboardInterrupt… 中断Python脚本。
trace_pipe
Ctrl
C
KeyboardInterrupt
如何让Python 2.7读取超时?
也就是说,我要指示Python “尝试从该文件读取50个字节;如果一秒钟后未成功,则放弃并返回” ?
采用
os.read(f.fileno(), 50)
代替。这不会等到已读取指定的字节数,而是在读取任何内容(最多指定的字节数)后返回。
万一您 没有 从该管道读取的内容,这不能解决您的问题。在这种情况下,您应该使用select模块中的内容select来 测试 是否有需要阅读的内容。
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