如何在不严重影响系统性能的情况下监视文件系统的更改?



恐怕又是一个新手问题了。我正在尝试使用Python 3.2.2(在这种情况下,版本很重要)来监视特定的Windows路径的更改。最简单的方法,也是我正在使用的方法是:

original_state = os.listdir(path_string)
while os.listdir(path_string) == original_state:
    time.sleep(1)
change_time = datetime.datetime.now()
我写这段代码是为了对另一个应用程序进行一些计时测试。考虑到这个目标,Python脚本需要(a)不对系统性能产生不利影响,(b)相对精确——+/- 1秒的误差幅度是我能证明的绝对最大值。不幸的是,此方法不满足第一个标准:当运行这段特定代码时,虚拟环境受到的冲击,从而大大降低了我试图准确测量其性能的操作的速度。

我读过如何监视文件系统的变化,如何监视文件的变化?,以及http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html(一篇文章推荐作为第二个SO问题的解决方案)。不幸的是,Tim Golden的代码似乎是Python 2。x代码——据我所知,Python 3不支持pywin32模块。

在Python 3中我能做些什么来监控这个特定的路径而不会遇到同样的性能问题?

根据ActivePython 3.2文档,他们的pywin32现在支持Python 3.x

在Linux上有iNotify和pyNotify。windows上类似的异步通知机制是FindFirstChangeNotification函数,它是FileSystemWatcher类

的一部分。

请查看Tim Golden页面上的解决方案:

  • http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html
  • http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html use_findfirstchange

还可以使用GFileMonitor监视文件或目录,由Gio负责底层操作系统细节。当然,如果这是一个Windows程序,您可能不会使用Gtk。为后代:

from gi.repository import Gio
gfile = Gio.file_new_for_path('/home/user/Downloads')
gfilemonitor = gfile.monitor(Gio.FileMonitorFlags.NONE, None)
gfilemonitor.connect('changed', callback_func)

最新更新