如何在/ sys中轮询文件

时间:2010-06-08 08:12:15

标签: python maemo sys pyinotify

我无法读取/ sys /中的文件,其中包含诺基亚N900手机上环境光线传感器Lux的光强度。

See thread on talk.maemo.org here

我尝试使用pyinotify来轮询文件,但这对我来说有点不对,因为文件总是“process_IN_OPEN”,“process_IN_ACCESS”和“process_IN_CLOSE_NOWRITE”

我基本上希望尽快得到更改,如果更改了某些内容会触发事件,请执行一个类......

这是我尝试过的代码,它有效但不像我预期的那样(我希望触发process_IN_MODIFY):

#!/usr/bin/env python

import os, time, pyinotify
import pyinotify

ambient_sensor = '/sys/class/i2c-adapter/i2c-2/2-0029/lux'

wm = pyinotify.WatchManager()  # Watch Manager
mask = pyinotify.ALL_EVENTS

def action(self, the_event):
    value = open(the_event.pathname, 'r').read().strip()
    return value

class EventHandler(pyinotify.ProcessEvent):
    ...
    def process_IN_MODIFY(self, event):
     print "MODIFY event:", action(self, event)
   ...

#log.setLevel(10)
notifier = pyinotify.ThreadedNotifier(wm, EventHandler())
notifier.start()

wdd = wm.add_watch(ambient_sensor, mask)
wdd

time.sleep(5)

notifier.stop()

更新1:

嗯,如果有一个特殊的机制,我所有出现的都没有线索:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux')
while True:
    value = f.read()
    print value
    f.seek(0)

这包含在一个自己的线程中,可以解决问题,但有没有人有更智能,更少CPU占用和更快的方式来获得最新价值?

2 个答案:

答案 0 :(得分:1)

由于/ sys / file是一个伪文件,它只是在底层的,易变的操作系统值上提供了一个视图,因此永远不会引发修改事件。由于文件是从下面“修改”的,因此它不遵循常规的文件系统语义。

如果永远不会引发修改事件,那么使用像pinotify这样的软件包不会让你到任何地方。 '寻找特定于平台的机制会更好。

对更新1的回复:

由于N900 maemo运行时支持GFileMonitor,因此您最好检查它是否可以提供您想要的异步事件。

忙碌的等待 - 我收集你知道 - 是浪费。在手机上它可以真正耗尽电池。你至少应该在忙碌的循环中睡觉。

答案 1 :(得分:0)

嗯,如果有一个特殊的机制,我所有出现的都没有线索:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux')
while True:
    value = f.read()
    print value
    f.seek(0)

这包含在一个自己的线程中,可以解决问题,但有没有人有更智能,更少CPU占用和更快的方式来获得最新价值?

干杯 比约恩