未调用 pyinotify 方法
Posted
技术标签:
【中文标题】未调用 pyinotify 方法【英文标题】:pyinotify methods not called 【发布时间】:2013-03-26 16:38:49 【问题描述】:我想创建一个监视文件夹的模块。我写了一些代码:
import os, pyinotify
class FileWatcher:
def start_watch(self, dir):
wm = pyinotify.WatchManager()
self.notifier = pyinotify.Notifier(wm, EventProcessor())
mask = pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE | pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO
wdd = wm.add_watch(dir, mask, rec=True)
while True:
self.notifier.process_events()
if self.notifier.check_events():
self.notifier.read_events()
def stop_watch(self):
self.notifier.stop()
print ('\nWatcher stopped')
class EventProcessor(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
print('in CREATE')
def process_IN_MODIFY(self, event):
print('in MODIFY')
def process_IN_DELETE(self, event):
print('in delete')
def process_IN_DELETE_SELF(self, event):
print('in delete self')
def process_IN_MOVED_FROM(self, event):
print('in MOVED_FROM')
def process_IN_MOVED_TO(self, event):
print('in IN_MOVED_TO')
if __name__ == "__main__":
watcher = FileWatcher()
try:
folder = "/home/user/Desktop/PythonFS"
watcher.start_watch(folder)
except KeyboardInterrupt:
watcher.stop_watch()
当我修改文件然后删除它时,从未调用方法 process_IN_MODIFY 和 process_IN_DELETE。猫我怎么解决的?
但是当我创建一个文件时,方法 process_IN_CREATE() 被调用了。
操作系统是 Linux mint 13。
UPD:新代码
【问题讨论】:
嗯,这段代码语法无效(没有缩进,粘贴,选中,然后按Ctrl+K
),它只定义了类和函数,并没有调用任何他们。
这是语法上有效的代码。方法应该从通知程序中调用,因为我将 EventProcessor 的实例放到了 pyinotify.Notifier(...) 的构造函数中
No it's not。以及为什么里面有一些可调用的函数,代码实际上并没有调用它们。
对不起。代码解析器工作不正常。而且 ctrl+k 对我没有帮助。我改变了这一行。
stop_watch 和 start_watch 从另一个模块调用。它简单的启动和停止。我认为他们没有触及我的问题。
【参考方案1】:
试试下面的代码。它与您的代码基本相同;我只添加了
f = FileWatcher()
f.start_watch('/tmp/test', None)
在末尾开始一个FileWatcher
。确保目录/tmp/test
存在,否则更改该行以指向存在的目录。
如果/tmp/test
中存在一个文件foo
,并且如果我修改了这个文件,
上面的程序打印
in create # after modification
in modify # after saving
in modify
in delete
现在如果我删除文件,程序会打印:
in delete
import os
import pyinotify
class FileWatcher:
notifier = None
def start_watch(self, dir, callback):
wm = pyinotify.WatchManager()
self.notifier = pyinotify.Notifier(wm, EventProcessor(callback))
mask = (pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE
| pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM
| pyinotify.IN_MOVED_TO)
wdd = wm.add_watch(dir, mask, rec=True)
while True:
self.notifier.process_events()
if self.notifier.check_events():
self.notifier.read_events()
class EventProcessor(pyinotify.ProcessEvent):
def __init__(self, callback):
self.event_callback = callback
def process_IN_CREATE(self, event):
# if self.event_callback is not None:
# self.event_callback.on_file_created(os.path.join(event.path,
# event.name))
print('in create')
def process_IN_MODIFY(self, event):
# if self.event_callback is not None:
# self.event_callback.on_file_modifed(os.path.join(event.path,
# event.name))
print('in modify')
def process_IN_DELETE(self, event):
print('in delete')
def process_IN_DELETE_SELF(self, event):
print('in delete self')
def process_IN_MOVED_FROM(self, event):
print('in moved_from')
def process_IN_MOVED_TO(self, event):
print('in moved to')
f = FileWatcher()
f.start_watch('/tmp/test', None)
顺便说一句,一旦你调用f.start_watch
,进程就会陷入无法逃脱的while True
循环。即使从另一个线程调用 f.stop_watch
也不会让你脱离这个 while 循环。
如果您计划使用线程,您可能需要将threading.Event
传递给start_watch
,并在while-loop
中检查其状态以确定何时跳出循环。
【讨论】:
以上是关于未调用 pyinotify 方法的主要内容,如果未能解决你的问题,请参考以下文章
慢 pyinotify.ThreadedNotifier.stop()