我刚开始在Mac上使用Python中的Watchdog library,并正在进行一些基本测试,以确保一切正常。不幸的是,它们不是——我似乎只能获得注册事件的文件所在文件夹的路径,而不是文件本身的路径。在
下面是一个简单的测试程序(根据Watchdog提供的示例稍作修改),在注册事件时打印出事件类型、路径和时间。在
import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
from watchdog.events import FileSystemEventHandler
class TestEventHandler(FileSystemEventHandler):
def on_any_event(self, event):
print("event noticed: " + event.event_type +
" on file " + event.src_path + " at " + time.asctime())
if __name__ == "__main__":
event_handler = TestEventHandler()
observer = Observer()
observer.schedule(event_handler, path='~/test', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except keyboardInterrupt:
observer.stop()
observer.join()
src_path变量应包含发生事件的文件的路径。在
但是,在我的测试中,当我修改一个文件时,src_path只打印包含该文件的文件夹的路径,而不是文件本身的路径。例如,当我修改文件夹europa
中的文件moon.txt
时,程序将打印以下输出:
要获得修改文件的完整路径,我需要做什么更改?在
问题解决了。事实证明,OSX中的
FSEvents
只返回文件修改事件的目录,让您自己扫描该目录以找出修改了哪个文件。虽然在FSEvents
文档中很容易找到,但在Watchdog文档中并没有提到这一点。在为了获得文件的完整路径,我添加了以下代码片段(inspired by this StackOverflow thread)以在目录中查找最近修改过的文件,以便在任何时候使用event.src_路径返回一个目录。在
mod_file_path
包含修改文件的完整路径。在感谢ekl提供您的解决方案。我只是偶然发现了同样的问题。但是,我以前使用PatternMatchingEventHandler,它需要对您的解决方案进行一些小的更改:
pattern
。这不像最初的PatternMatchingEventHandler
那么灵活,但是应该可以满足大多数需求,如果您想扩展它,您无论如何都会得到这个想法。在以下是您必须放入
FileSystemEventHandler
子类中的代码:我更改的另一件事是在对文件列表运行
max()
之前检查目录是否为空。max()
不能处理空列表。在相关问题 更多 >
编程相关推荐