我无法读取/ 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占用和更快的方式来获得最新价值?
答案 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占用和更快的方式来获得最新价值?
干杯 比约恩