diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2005-07-21 04:08:54 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2005-07-21 04:08:54 +0000 |
| commit | 9566a61a22e1da30fb8abfef4b25d83d0c465be9 (patch) | |
| tree | 30155c97585248e9592ab6b8bd632636710f75c7 /django/utils/autoreload.py | |
| parent | c21f6ecee24c6587bb8ddddc878aad3fd29b40a7 (diff) | |
Added auto-reload to standalone server! Fixes #113. Thanks very much to Jason Huggins for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@266 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/utils/autoreload.py')
| -rw-r--r-- | django/utils/autoreload.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/django/utils/autoreload.py b/django/utils/autoreload.py new file mode 100644 index 0000000000..140c83147c --- /dev/null +++ b/django/utils/autoreload.py @@ -0,0 +1,50 @@ +# Autoreloading launcher. +# Borrowed from Peter Hunt and the CherryPy project (http://www.cherrypy.org). +# Some taken from Ian Bicking's Paste (http://pythonpaste.org/). + +import os, sys, thread, time + +RUN_RELOADER = True +reloadFiles = [] + +def reloader_thread(): + mtimes = {} + while RUN_RELOADER: + for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())) + reloadFiles: + if filename.endswith(".pyc"): + filename = filename[:-1] + mtime = os.stat(filename).st_mtime + if filename not in mtimes: + mtimes[filename] = mtime + continue + if mtime > mtimes[filename]: + sys.exit(3) # force reload + time.sleep(1) + +def restart_with_reloader(): + while True: + args = [sys.executable] + sys.argv + if sys.platform == "win32": + args = ['"%s"' % arg for arg in args] + new_environ = os.environ.copy() + new_environ["RUN_MAIN"] = 'true' + exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ) + if exit_code != 3: + return exit_code + +def main(main_func, args=None, kwargs=None): + if os.environ.get("RUN_MAIN") == "true": + if args is None: + args = () + if kwargs is None: + kwargs = {} + thread.start_new_thread(main_func, args, kwargs) + try: + reloader_thread() + except KeyboardInterrupt: + pass + else: + try: + sys.exit(restart_with_reloader()) + except KeyboardInterrupt: + pass |
