新しいファイルが特定のディレクトリに作成されるたびに、ファイルを解析したいと考えています。このため、pyinotifyを使用して、ディレクトリを設定してIN_CREATE
カーネルイベントを監視し、parse()
メソッドを起動しようとしています。ここで作成時にファイルを読み込んでバグを修正しますか?
は、モジュールです:
from pyinotify import WatchManager,
ThreadedNotifier, ProcessEvent, IN_CREATE
class Watcher(ProcessEvent):
watchdir = '/tmp/watch'
def __init__(self):
ProcessEvent.__init__(self)
wm = WatchManager()
self.notifier = ThreadedNotifier(wm, self)
wdd = wm.add_watch(self.watchdir, IN_CREATE)
self.notifier.start()
def process_IN_CREATE(self, event):
pfile = self._parse(event.pathname)
print(pfile)
def _parse(self, filename):
f = open(filename)
file = [line.strip() for line in f.readlines()]
f.close()
return file
if __name__ == '__main__':
Watcher()
問題はそう(ファイルがwatcher.py
ながら、別のウィンドウで作成されたように、新しいファイルの作成イベントによってトリガされたとき_parseによって返されたリストが空であるということです
$ python watcher.py
[]
...しかし、奇妙なことに、それは直接呼び出されたときにインタプリタセッションからうまくいきます。
>>> import watcher
>>> w = watcher.Watcher()
>>> w._parse('/tmp/watch/sample')
['This is a sample file', 'Another line', 'And another...']
どうしてですか?この問題をデバッグするのに最も遠いのは、何かがpyinotifyを使ってファイルを正しく読み込めないことを知ることです。しかし、なぜ?
競合状態? – SilentGhost
'IN_CREATE'に加えて' IN_MODIFY'にフックする必要があります。すなわち 'pyinotify.IN_CREATE | pyinotify。IN_MODIFY' –