summaryrefslogtreecommitdiff
path: root/django/utils/autoreload.py
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2005-07-21 04:08:54 +0000
committerAdrian Holovaty <adrian@holovaty.com>2005-07-21 04:08:54 +0000
commit9566a61a22e1da30fb8abfef4b25d83d0c465be9 (patch)
tree30155c97585248e9592ab6b8bd632636710f75c7 /django/utils/autoreload.py
parentc21f6ecee24c6587bb8ddddc878aad3fd29b40a7 (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.py50
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