如何轮询文件以进行更改?

Lau*_*low 6 python udev polling

问题

我希望下面的脚本最多打印一个事件然后停止(它的编写只是为了说明问题).

#!/usr/bin/env python

from select import poll, POLLIN

filename = "test.tmp"

# make sure file exists
open(filename, "a").close()

file = open(filename, "r+")

p = poll()
p.register(file.fileno(), POLLIN)

while True:
    events = p.poll(100)
    for e in events:
        print e
        # Read data, so that the event goes away?
        file.read()
Run Code Online (Sandbox Code Playgroud)

但是,它每秒打印约70000个事件.为什么?

背景

我写了一个内部使用pyudev.Monitor类的类.除此之外,它还使用poll对象轮询 fileno()方法提供的fileno以进行更改.

现在我正在尝试为我的班级编写单元测试(我意识到我应该首先编写单元测试,所以不需要指出它),因此我需要为自己编写自己的fileno()方法模拟pyudev.Monitor对象,我需要控制它,以便我可以触发poll对象来报告事件.正如上面的代码所示,我无法停止报告看似不存在的事件!

我可以在民意调查类中找不到acknowledge_event()或类似内容,以使事件消失(我怀疑只有一个事件在某种程度上被卡住),搜索谷歌并且这个网站什么都没有产生.我在Ubuntu 10.10上使用python 2.6.6.

Rak*_*kis 5

使用管道而不是文件会更幸运。试试这个:

#!/usr/bin/env python
import os
from   select import poll, POLLIN

r_fd, w_fd = os.pipe()

p = poll()
p.register(r_fd, POLLIN)

os.write(w_fd, 'X') # Put something in the pipe so p.poll() will return

while True:
    events = p.poll(100)
    for e in events:
        print e
        os.read(r_fd, 1)
Run Code Online (Sandbox Code Playgroud)

这将打印出您正在寻找的单个事件。要触发轮询事件,您只需向可写文件描述符写入一个字节即可。