Dynamicky načítá Python zdrojový kód

hlasů
6

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í?

Položena 22/12/2010 v 22:56
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

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.

Odpovězeno 22/12/2010 v 23:18
zdroj uživatelem

hlasů
7

Baňka se používá Werkzug své základní run_with_reloaderfunkce (nalezený v serving.py) ... což je samo o sobě použití restart_with_reloadera reloader_loopfunkce vytvořené dříve ve stejném souboru.

run_with_reloaderzaloží 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á threadmodul plodit nové vlákno nebo podproces, který spouští svoji funkci serveru. To pak spustí reloader_loopa čeká.

reloader_loopjednoduš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
Odpovězeno 22/12/2010 v 23:43
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more