python - 如何轮询/sys中的文件

标签 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 且更快的方法来获取最新值?

最佳答案

由于/sys/file 是一个伪文件,它只是呈现一个底层的、易变的操作系统值的 View ,因此永远不会引发修改事件是有道理的。由于文件是从下方“修改”的,因此它不遵循常规文件系统语义。

如果永远不会引发修改事件,那么使用像 pinotify 这样的包将无济于事。 'twould be better to look for a platform-specific mechanism.

对更新 1 的回应:

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

忙着等待——我想你知道——是一种浪费。在手机上,它确实会耗尽电池电量。你至少应该在繁忙的循环中 sleep 。

关于python - 如何轮询/sys中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2995664/

相关文章:

python - 属性错误 : 'str' object has no attribute 'transID'

Python + QT + Gstreamer

Python,引用与运行文件同目录下的一个文件

Python 导入迭代,sys.path

python - 在 Pyinstaller 中包含带有程序的 excel 文件

python - 在脚本中使用 pysed

python - 如何将 numpy 矩阵的列移动到最后一列?

python - 如何处理 hildon.Seekbar 中的后退和前进按钮?

mobile - 如何开始移动开发

linux - 如何使用 sys 文件系统将 RTC 设置为唤醒源并在所有日期设置特定时间