一尘不染

在Python中读取具有超时的文件

linux

在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-
CKeyboardInterrupt… 中断Python脚本。

如何让Python 2.7读取超时?

也就是说,我要指示Python “尝试从该文件读取50个字节;如果一秒钟后未成功,则放弃并返回”


阅读 367

收藏
2020-06-02

共1个答案

一尘不染

采用

os.read(f.fileno(), 50)

代替。这不会等到已读取指定的字节数,而是在读取任何内容(最多指定的字节数)后返回。

万一您 没有 从该管道读取的内容,这不能解决您的问题。在这种情况下,您应该使用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
2020-06-02