问题

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

#!/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()

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

背景

我编写了一个在内部使用pyudev.Monitor类的类。除其他事项外,它使用poll object轮询由fileno()方法提供的fileno以获取更改。

现在,我正在尝试为我的类编写一个单元测试(我意识到我应该先编写单元测试,因此无需指出),因此,我需要为自己编写自己的fileno()方法模拟pyudev.Monitor对象,我需要对其进行控制,以便可以触发民意调查对象来报告事件。如上述代码所示,我无法停止报告似乎不存在的事件!

我在民意测验类中找不到任何accept_event()或类似的东西可以使事件消失(我怀疑只有一个事件以某种方式被卡住了),搜索google却没有任何结果。我在Ubuntu 10.10上使用python 2.6.6。

最佳答案

使用管道而不是文件会带来更好的运气。尝试以下方法:

#!/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)

这将打印出您要查找的单个事件。要触发轮询事件,您要做的就是向可写文件描述符中写入一个字节。

关于python - 如何轮询文件以进行更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4782756/

10-13 00:03