Как опросить файл в / sys - PullRequest
2 голосов
/ 08 июня 2010

Я застрял, читая файл в / sys /, который содержит интенсивность освещения в люксах датчика внешней освещенности на моем телефоне Nokia N900.

Смотрите тему на talk.maemo.org здесь

Я пытался использовать 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)

Это, завернутый в собственный поток, может сработать, но есть ли у кого-нибудь более умный, менее загруженный ЦП и более быстрый способ получить последнее значение?

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Поскольку / sys / file является псевдофайлом, который просто представляет представление базового, изменчивого значения операционной системы, имеет смысл, что никогда не произойдет событие модификации. Поскольку файл «модифицирован» снизу, он не следует обычной семантике файловой системы.

Если событие изменения никогда не вызывается, использование пакета, такого как pinotify, ни к чему вас не приведет. «Лучше было бы найти механизм для конкретной платформы.

Ответ на обновление 1:

Поскольку среда выполнения N900 maemo поддерживает GFileMonitor , вам следует проверить, может ли оно предоставить желаемое асинхронное событие.

Оживленное ожидание - как я понимаю, вы знаете - расточительно. На телефоне это действительно может разрядить аккумулятор. Вы должны хотя бы спать в своей занятой петле.

0 голосов
/ 08 июня 2010

Ммм, все, что я придумал, не имея понятия, есть ли специальный механизм, таково:

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

Это, завернутый в собственный поток, может сработать, но есть ли у кого-нибудь более умный, менее загруженный ЦП и более быстрый способ получить последнее значение?

Приветствие Бьорн

...