Kudzu
Kudzu

Reputation: 3638

How can I watch for a filesystem change without drastically affecting system performance?

Time for another newbie question, I fear. I'm attempting to use Python 3.2.2 (the version is important, in this case) to monitor a particular Windows path for changes. The simplest method, and the method I'm using, is:

original_state = os.listdir(path_string)

while os.listdir(path_string) == original_state:
    time.sleep(1)

change_time = datetime.datetime.now()

I'm writing this code to do some timing tests of another application. With that goal in mind, the Python script needs to (a) not adversely affect system performance, and (b) be relatively precise -- a margin of error of +/- 1 second is the absolute maximum I can justify. Unfortunately, this method doesn't meet the first criterion: When running this particular bit of code, the virtual environment is hammered, drastically slowing down the operations whose performance I'm trying to accurately measure.

I've read how to watch a File System for change, How do I watch a file for changes?, and http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html (an article recommended as a solution to that second SO question.) Unfortunately, Tim Golden's code appears to be Python 2.x code -- as near as I can tell, the pywin32 module isn't supported in Python 3.

What can I do in Python 3 to monitor this particular path without running into the same performance problems?

Upvotes: 3

Views: 712

Answers (3)

andy.holmes
andy.holmes

Reputation: 3696

It is also possible to monitor a file or directory using GFileMonitor with Gio taking care of the underlying operating system details. Although, granted you likely won't be using Gtk if this is a Windows program. For posterity:

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)

Upvotes: 0

pyfunc
pyfunc

Reputation: 66739

On Linux there is iNotify and pyNotify. Similar asynchronous notification mechanism on windows is FindFirstChangeNotification function which is a part of FileSystemWatcher Class

Please look at solutions on the Tim Golden's page:

Upvotes: 1

Neil
Neil

Reputation: 55432

According to the ActivePython 3.2 Documentation, their pywin32 now supports Python 3.x

Upvotes: 2

Related Questions