Jsem v současné době hraje s baňky a nemohu přijít na to, jak se ladění mechanismus funguje. Abychom byli přesnější, když uložím soubor python s mou žádost Nepotřebuji k restartování serveru, bude načten automaticky, když jsem se podat žádost. Takže moje otázka je, jak se běžící program, vím, že to byl změněn a reagovat na ně, že se změní?
Dynamicky načítá Python zdrojový kód
Vestavěné reload()
funkce může udělat za vás. Je pravděpodobné, že tato funkce je za tím, co dělá Baňka přeložit kód (po zjištění, že došlo ke změně na disku nějak).
Otázka Jak mohu vyložit (Načíst znovu) Python modul? má více informací na toto téma.

Baňka se používá Werkzug své základní run_with_reloader
funkce (nalezený v serving.py
) ... což je samo o sobě použití restart_with_reloader
a reloader_loop
funkce vytvořené dříve ve stejném souboru.
run_with_reloader
založí jiný proces python (opětovným spuštěním Werkzug se všemi stejnými argumenty, které jste složili na první) a tato nová procesů využívá thread
modul plodit nové vlákno nebo podproces, který spouští svoji funkci serveru. To pak spustí reloader_loop
a čeká.
reloader_loop
jednoduše prochází všechny moduly, které byly importovány a dostane své datum poslední úpravy. Pak v určených intervalech (což standardně 1s) Kontroluje všechny soubory znovu vidět v případě, že jste byl změněn. Mají-li se v současné době běží ( Slave ) Werkzug proces ukončí (ukončí) s výstupním kódem 3. Jakmile se ukončí, nit nebo dílčí proces to začalo (což je vlastně dělat práci), je ukončena také. Master proces zkontroluje, zda je výstupní kód byl 3. Pokud by to bylo, že založí nový podřízený podproces, stejně jako tomu bylo dříve. V opačném případě se ukončí stejným návratového kódu.
Zde je kód pro odkaz:
def reloader_loop(extra_files=None, interval=1):
"""When this function is run from the main thread, it will force other
threads to exit when any modules currently loaded change.
Copyright notice. This function is based on the autoreload.py from
the CherryPy trac which originated from WSGIKit which is now dead.
:param extra_files: a list of additional files it should watch.
"""
def iter_module_files():
for module in sys.modules.values():
filename = getattr(module, '__file__', None)
if filename:
old = None
while not os.path.isfile(filename):
old = filename
filename = os.path.dirname(filename)
if filename == old:
break
else:
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield filename
mtimes = {}
while 1:
for filename in chain(iter_module_files(), extra_files or ()):
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
old_time = mtimes.get(filename)
if old_time is None:
mtimes[filename] = mtime
continue
elif mtime > old_time:
_log('info', ' * Detected change in %r, reloading' % filename)
sys.exit(3)
time.sleep(interval)
def restart_with_reloader():
"""Spawn a new Python interpreter with the same arguments as this one,
but running the reloader thread.
"""
while 1:
_log('info', ' * Restarting with reloader...')
args = [sys.executable] + sys.argv
new_environ = os.environ.copy()
new_environ['WERKZEUG_RUN_MAIN'] = 'true'
# a weird bug on windows. sometimes unicode strings end up in the
# environment and subprocess.call does not like this, encode them
# to latin1 and continue.
if os.name == 'nt':
for key, value in new_environ.iteritems():
if isinstance(value, unicode):
new_environ[key] = value.encode('iso-8859-1')
exit_code = subprocess.call(args, env=new_environ)
if exit_code != 3:
return exit_code
def run_with_reloader(main_func, extra_files=None, interval=1):
"""Run the given function in an independent python interpreter."""
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
thread.start_new_thread(main_func, ())
try:
reloader_loop(extra_files, interval)
except KeyboardInterrupt:
return
try:
sys.exit(restart_with_reloader())
except KeyboardInterrupt:
pass