reloader.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import os
  2. from os import path
  3. import sys
  4. import thread
  5. def init(server):
  6. thread.start_new_thread(_reloader, (server,))
  7. def _reloader(server):
  8. import inotifyx
  9. fd = inotifyx.init()
  10. rootdir = path.dirname(path.abspath(__file__))
  11. for dirpath, _, _ in os.walk(rootdir):
  12. inotifyx.add_watch(fd, dirpath, inotifyx.IN_CLOSE_WRITE)
  13. config_path = path.normpath(path.join(rootdir, '..', 'config.py'))
  14. config_wd = inotifyx.add_watch(fd, config_path, inotifyx.IN_CLOSE_WRITE)
  15. while True:
  16. events = inotifyx.get_events(fd)
  17. for event in events:
  18. if event.name == '4913': # https://code.google.com/p/vim/source/browse/src/fileio.c?spec=svn94df797ed6b03d5387b5ed7526f8c65024112822&r=29eb4c2a33ac701bfcd4d2e2bed7864eba876e0e#3767
  19. continue
  20. elif event.name is None and event.wd == config_wd:
  21. print 'config.py changed, reloading...'
  22. do_reload(fd, server)
  23. return
  24. elif event.name.endswith('.py'):
  25. print event.name, 'changed, reloading...'
  26. do_reload(fd, server)
  27. return
  28. def do_reload(fd, server):
  29. os.close(fd)
  30. server.stop()
  31. os.closerange(sys.stderr.fileno()+1, os.sysconf('SC_OPEN_MAX')) # close keep-alive client sockets
  32. os.execv(sys.argv[0], sys.argv)