import os from os import path import sys import thread def init(server): thread.start_new_thread(_reloader, (server,)) def _reloader(server): import inotifyx fd = inotifyx.init() rootdir = path.dirname(path.abspath(__file__)) for dirpath, _, _ in os.walk(rootdir): inotifyx.add_watch(fd, dirpath, inotifyx.IN_CLOSE_WRITE) config_path = path.normpath(path.join(rootdir, '..', 'config.py')) config_wd = inotifyx.add_watch(fd, config_path, inotifyx.IN_CLOSE_WRITE) while True: events = inotifyx.get_events(fd) for event in events: if event.name == '4913': # https://code.google.com/p/vim/source/browse/src/fileio.c?spec=svn94df797ed6b03d5387b5ed7526f8c65024112822&r=29eb4c2a33ac701bfcd4d2e2bed7864eba876e0e#3767 continue elif event.name is None and event.wd == config_wd: print 'config.py changed, reloading...' do_reload(fd, server) return elif event.name.endswith('.py'): print event.name, 'changed, reloading...' do_reload(fd, server) return def do_reload(fd, server): os.close(fd) server.stop() os.closerange(sys.stderr.fileno()+1, os.sysconf('SC_OPEN_MAX')) # close keep-alive client sockets os.execv(sys.argv[0], sys.argv)